[英]Entity Framework Core connection management
在asp.net核心项目中,我需要一个加密的SQLite数据库。 为此,我创建了自己的SqliteEncryptedConnection
,它继承自Microsoft.Data.Sqlite.SqliteConnection
并在Open()
方法中设置加密密钥(执行PRAGMA key = ...)
我有一个扩展方法,通过创建连接并给它来配置我的EF上下文。
public static void UseEncryptedSqlite(this DbContextOptionsBuilder optionsBuilder, string connectionString, string password)
{
var connection = new SqliteEncryptedConnection(connectionString, password);
connection.Open();
optionsBuilder.UseSqlite(connection);
}
我必须在将它提供给EF之前打开连接,否则EF会为每个单独的查询自动打开和关闭它,而Open()
方法现在非常昂贵。
我的解决方案的问题是我的连接永远不会丢弃也不会关闭!
脏解决方案是在EF上下文的Dispose方法中处理连接,但我真的不想处置注入的依赖项,而不是由上下文拥有的依赖项。
我得到了在EF核心团队工作的Brice Lambson的答案:
你正朝着正确的方向前进 - 少打开连接。 请记住,SQLite连接本质上只是文件流,因此保持打开时间不是真正的问题。
如果每个连接只有一个DbContext实例,DbContext仍然可以拥有连接,即使它是在外部创建的。 只需将连接部署在DbContext.Dispose()内部即可。
如果这还不够,您可以尝试创建连接池。 管理生命周期可能会变得棘手。 重要的是,连接不会在创建它的线程之外使用。
使用Cache = Shared(即共享缓存模式 )也可能有助于吞吐量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.