解決SQL Server暫時性連線錯誤問題,現在retry有更簡單的做法。
真實世界中,有時候我會看到AP連線資料庫發生database is not currently available的錯誤訊息,
但過沒多這錯誤又消失且AP程式碼也都沒異動,尤其當夜間批次作業發生這樣情況時,
隔天早上查看Log只知道凌晨4:15:30資料庫無法連線,但4:15:50的Log卻又告訴我們,
AP進行retry資料庫連線又神奇正常,老實說,這樣的短暫連線異常情況還真不好處理,
像之前有遇過防毒軟體更新或Windows update影響SQL Server短暫連接問題,
另外,網路High Latency或頻寬不足也有可能,
我也懷疑過是否為”集區封鎖期”所造成的短暫資料庫連接問題,MS docs說明如下
由於connection pool會cache錯誤並在5秒~1分鐘後重新拋出錯誤,
所以無法馬上重新連線資料庫(目前只針對Azure SQL Database連線移除該行為,並提升雲端應用程式效能),
當然如果你覺得該行為對應用程式有負面影響,現在我們有機會針對sqlconnection進行調整
以前我們可能會catch exception自行實作connection retry,當然retry次數要有所限制,
現在我們可以更輕鬆實現retry來解決暫時性連線錯誤問題。
另外,Ado.net的connection timeout預設15秒我覺得太短,
我會建議至少30秒起跳,重試間隔建議>=10秒,相關屬性預設值如下
因為我的SQL Server有alwaysOn,所以我的sqlconnectionBuilder如下,
我相信你一定知道我在說什麼,good luck。
參考
EF/ADO.NET Connection Resiliency
Implement resilient Entity Framework Core SQL connections
Troubleshoot, diagnose, and prevent SQL connection errors and transient errors for SQL Database
Mitigation: Pool Blocking Period
SQL Server Connection Pooling (ADO.NET)
SQL Database application development overview
Step 4: Connect resiliently to SQL with ADO.NET
TIPS FOR IMPROVING ENTITY FRAMEWORK CORE PERFORMANCE WITH AZURE SQL DATABASES
Azure: How to solve Azure SQL “database is not currently available”