我有一個深入的問題。我想了解為什么 aSqlConnection被關閉以及如何檢測連接池是否實際發生。我有兩個不同版本的類,它們抽象與數據庫對話并返回DataTable. 我提供的是問題/疑問的示例。版本 1SqlConnection在實例化時打開 a 并將其保持打開狀態。這是一個單線程進程,它處理傳入消息并將結果盡快寫入數據庫。這就是永久開放背后的想法SqlConnection:public class SpecialDbClientVersion1 : IDisposable{ string connStr; SqlConnection dbConn; public SpecialDbClientVersion1(string connStr) { this.connStr = connStr; this.dbConn = new SqlConnection(connStr); try { dbConn.Open(); } catch (SqlException ex) { throw new Exception($"An exception occurred while trying to connect to {dbConn.Database}", ex); } } public DataTable QuerySqlReturnResultAsDataTable(string sql, int commandTimeout = 30) { try { var cmd = new SqlCommand(sql, dbConn); cmd.CommandType = CommandType.Text; cmd.CommandTimeout = commandTimeout; var dt = new DataTable(); var adapter = new SqlDataAdapter(cmd); adapter.Fill(dt); return dt; } catch (Exception e) { throw new InvalidOperationException(e.Message); } } public void Dispose() { dbConn.Dispose(); }}當我測試這個時,一切都很順利,并且吞吐量非常高。最終由于SqlConnection某種原因關閉了。拋出一個錯誤,聚會就結束了。問題 1Closed :有人可以解釋一下,在我不調用該方法的情況下,什么會導致此連接進入某種狀態Close()嗎?現在版本 2 在一個塊中執行所有工作using。根據互聯網,運行時應該神奇地在幕后使用連接池。SqlConnection這是Microsoft處理對象的最佳實踐。使用連接池應該不會對性能造成太大影響。public class SpecialDbClientVersion2{ string connStr; SqlConnection dbConn; public SpecialDbClientVersion2(string connStr) { this.connStr = connStr; }問題2:如何判斷連接池是否真正被使用?寫入數據庫需要盡可能快,我擔心版本 2 每次都必須重新建立與數據庫的連接。這會破壞性能。如何衡量是否發生連接池以及它是否影響服務的吞吐量?我一直在尋找關于這個主題的深入研究資源,但我發現的大部分內容只是“在塊中使用 SqlConnection using,一切都會好起來的”。我正在尋找比這更深入的解釋。我真的很想了解這里發生的事情的本質,以便我找到正確的性能問題。感謝您提供的任何見解。
1 回答

躍然一笑
TA貢獻1826條經驗 獲得超6個贊
正如其他人提到的,連接可能在服務器端關閉或由于空閑超時而關閉,請檢查服務器端日志以了解詳細信息。
對于問題的第二部分,有一些性能計數器可以跟蹤連接池信息。NumberOfPooledConnections
這可以通過代碼查看(請參閱鏈接頁面的示例),設置正在運行的程序的進程 ID 并顯示諸如和 之類的值,NumberOfNonPooledConnections
以查看連接池是否確實被進程使用。
通過打開默認關閉的計數器,您還可以監視NumberOfFreeConnections
它,它會告訴您是否有免費的開放連接可供您的程序拾取并使用以獲得立即響應,而無需打開您要求的連接的開銷。
- 1 回答
- 0 關注
- 109 瀏覽
添加回答
舉報
0/150
提交
取消