[英]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.