繁体   English   中英

实体框架核心连接管理

[英]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()方法现在非常昂贵。

我的解决方案的问题是我的连接永远不会丢弃也不会关闭!

  1. 在Open中设置加密密钥是否正确?
  2. 有没有办法知道何时处理上下文? 或者将其配置为在处理后关闭并处理连接?
  3. 是否有另一种(更好的)方法来管理连接?

脏解决方案是在EF上下文的Dispose方法中处理连接,但我真的不想处置注入的依赖项,而不是由上下文拥有的依赖项。

我得到了在EF核心团队工作的Brice Lambson的答案:

你正朝着正确的方向前进 - 少打开连接。 请记住,SQLite连接本质上只是文件流,因此保持打开时间不是真正的问题。

如果每个连接只有一个DbContext实例,DbContext仍然可以拥有连接,即使它是在外部创建的。 只需将连接部署在DbContext.Dispose()内部即可。

如果这还不够,您可以尝试创建连接池。 管理生命周期可能会变得棘手。 重要的是,连接不会在创建它的线程之外使用。

使用Cache = Shared(即共享缓存模式 )也可能有助于吞吐量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM