簡體   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