Skip to content

FluentData 中使用临时表

🏷️ FluentData

最近又开始做了一部分系统慢接口的优化,有个 SQL 优化时需要使用到临时表。要先创建一个临时表并插入数据,然后在之后的查询中使用。

由于项目中 ORM 框架使用的是 FluentData,需要通过特定的写法才能实现上述效果。 FluentData 是一个轻量级的 ORM 框架,性能还是比较高的。

如果使用 DbContext 的默认设置执行 SQL,后面的查询中会报找不到临时表的异常。这个是由于 FluentData 默认设置每次查询是要创建一个新连接的(由于 SqlConnection 默认是开启连接池的,这样做本身并没有什么问题),这就导致创建临时表的会话和后面使用临时表的会话并不是同一个会话,而 #t 临时表只能在当前会话中访问,所以就发生了异常。

FluentDataIDbContext 接口提供了一个 UseSharedConnection 方法:

csharp
IDbContext UseSharedConnection(bool useSharedConnection);

调用该方法并传递参数为 true 时,之后 IDbContext 实例中执行的 SQL 都会使用同一个 Connection 。使用方法如下:

csharp
using (var db = dbContext.UseSharedConnection(true))
{
    // do something
    db.Sql(tempSql).Execute(); // 创建临时表
    // 执行其它 SQL
}

建议用 usingdbContext 包起来。因为 UseSharedConnectionfalse 时每个 DbCommand 执行结束后都会自动关闭数据库连接(返回到连接池),而 UseSharedConnectiontrue 时则只有在 dbContext 被注销时才会关闭连接。

有一点要注意的是在使用 using 语法时,using 结束后 UseSharedConnection 的值仍然为 true,如果后面仍有查询,需要手动根据情况再次设置。