[研究]ASP.NET+SQL Server,System.InvalidOperationException: 已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。
2024-05-17
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19
********************************************************************************
System.InvalidOperationException: 已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。
System.InvalidOperationException: 已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。
Generated: Wed, 22 May 2024 11:36:49 GMT
System.Web.HttpUnhandledException (0x80004005): 已發生類型 'System.Web.HttpUnhandledException' 的例外狀況。 ---> System.InvalidOperationException: 已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。
於 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
於 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
於 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
於 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
於 System.Data.SqlClient.SqlConnection.Open()
於 CSC.index.FixGameCreatDate() 於 D:\Git\WebApplication1\Solution1\WebApplication1\index.aspx.cs: 行 160
於 CSC.index.Page_Load(Object sender, EventArgs e) 於 D:\Git\WebApplication1\Solution1\WebApplication1\index.aspx.cs: 行 15
於 System.Web.UI.Control.OnLoad(EventArgs e)
於 System.Web.UI.Control.LoadRecursive()
於 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
於 System.Web.UI.Page.HandleError(Exception e)
於 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
於 System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
於 System.Web.UI.Page.ProcessRequest()
於 System.Web.UI.Page.ProcessRequest(HttpContext context)
於 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
於 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
於 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
|
********************************************************************************
使用中,並已達共用集區大小的最大值。
ChatGPT
你遇到的 System.InvalidOperationException 錯誤訊息表示你的應用程式在連接到 SQL Server 時,超過了連接逾時設定。在連接池中已無可用的連接,而所有的連接都被佔用,並且已達到連接池大小的最大值。
可能的原因
1.連接未正確關閉:你可能有未釋放的資料庫連接。確保每次開啟的連接都被正確關閉和釋放回連接池。
2.連接池大小設置過小:連接池的大小設置過小,無法滿足應用程式的需求。
3.應用程式對資料庫的需求過高:應用程式對資料庫的連接需求超出了目前連接池大小的設定。
解決方法
1.確保連接被正確關閉:使用 using 語句來確保連接被正確關閉。
using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 執行資料庫操作 } // 這裡會自動關閉連接 |
2.調整連接池大小:在連接字串中增加 Max Pool Size 的設定。例如:
string connectionString = "Data Source=server;Initial Catalog=database;User ID=username;Password=password;Max Pool Size=100;"; |
3.優化資料庫查詢:優化查詢,確保查詢執行時間最短化,減少連接持續時間。
4.檢查資源洩漏:確認應用程式中是否有資源洩漏,導致連接未正確釋放。
具體例子
確保正確釋放連接:
public void ExecuteQuery() { string connectionString = "your_connection_string_here"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 你的查詢和操作 using (SqlCommand cmd = new SqlCommand("SELECT * FROM YourTable", conn)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 處理資料 } } } } // 這裡會自動釋放連接 } |
調整連接池大小
調整你的連接字串來增加 Max Pool Size,例如:
string connectionString = "Data Source=server;Initial Catalog=database;User ID=username;Password=password;Max Pool Size=200;"; |
監控與診斷
1.使用 SQL Server Profiler 或 Activity Monitor 來監控當前連接的使用情況。
2.分析應用程式日誌 來確保沒有過多的長時間持有的連接。
這些步驟應該能夠幫助你解決 System.InvalidOperationException 連接逾時的錯誤。確保正確管理和釋放連接是避免此類問題的關鍵。
********************************************************************************
連接池 預設值多少? 最大值多少?
ChatGPT
在 ADO.NET 中,連接池的預設值和最大值如下:
連接池的預設值
最大連接池大小 (Max Pool Size):預設值是 100。
最小連接池大小 (Min Pool Size):預設值是 0。
這意味著,除非在連接字串中明確設定,連接池最多可以包含 100 個連接。
連接池的最大值
最大值 (Max Pool Size):理論上可以設定到非常高的值,但這取決於系統資源和 SQL Server 的配置。設定過高的值可能會導致系統資源耗盡(例如,內存和 CPU 負載過高)。
設定連接池大小
你可以在連接字串中通過 Max Pool Size 和 Min Pool Size 來設定連接池的大小。例如:
string connectionString = "Data Source=server;Initial Catalog=database;User ID=username;Password=password;Max Pool Size=200;Min Pool Size=10;";
這個設定將最大連接池大小設為 200,最小連接池大小設為 10。
調整連接池大小的建議
1.根據應用需求進行調整:根據你的應用程式的連接需求和併發量來調整 Max Pool Size。
2.監控和測試:通過監控和壓力測試來確定最佳的連接池大小設置。
3.避免過大或過小的值:設置過大可能會導致系統資源耗盡,設置過小可能會導致連接耗盡錯誤。
通過正確管理和配置連接池,可以提高應用程式的性能和穩定性。
********************************************************************************
Copilot
這個錯誤訊息表示已經超過連接逾時的設定。在取得集區連接之前,等待的時間已經超過了預設的時間。可能的原因有幾個:
- 連線逾時:執行主控台應用程式時,目前的使用者對資料庫沒有存取權限,因此無法建立連線。請確認執行主控台應用程式的使用者是否具有正確的資料庫存取權限。
- CommandTimeout 設定過小:如果你使用的是 Entity Framework 或 ADO.NET,預設的 CommandTimeout 是 30 秒。你可以調整這個時間,例如改大一點,以避免連線逾時的問題。
- SQL 效能問題:如果查詢的資料量很大,或者沒有使用到適當的索引,也可能導致連線逾時。你可以檢查是否有適當的索引,並優化 SQL 效能。
- 連線池大小不足:連線池是用來管理資料庫連線的,預設大小是 100。如果同一時間有大量連線進來,可能會造成連線池爆滿,出現逾時的錯誤訊息。你可以調整連線池的大小,例如增加到更大的數值。
https://ithelp.ithome.com.tw/questions/10212631
https://dotblogs.com.tw/rainmaker/2016/03/30/115341
https://dotblogs.com.tw/CHIs_ITNote/2021/01/28/170805
********************************************************************************
相關
[研究][ASP.NET]找不到網路路徑。建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。
https://shaurong.blogspot.com/2024/05/aspnet-sql-server.html
[研究]ASP.NET+SQL Server,System.InvalidOperationException: 已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。
https://shaurong.blogspot.com/2024/05/aspnetsql-serversysteminvalidoperatione.html
沒有留言:
張貼留言