[C#] Manager your Sqlconnection

解決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。

 

參考

PoolBlockingPeriod Enum

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

Connection Resiliency

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”