最近發現 ASP.NET 2.0 網站與 Oracle 資料庫的連線遲遲沒有釋放(連線狀態為 INACTIVE),導致資料庫伺服器連線數量暴增,並持續出現一些 ORA-???? 的錯誤訊息。

經調整連線字串中的 Max Pool 與 Min Pool 之後,情況改善不少,但仍然會有連線數量太大的問題。

查了一下 Google,Oracle 連線字串裡面有 Connection Lifetime 和 Connection Timeout 可以設定,但實際使用後卻發現,Oracle  .NET Provider 根本不支援這些屬性,連 OLEDB 與 ODBC 也一樣不支援......殘念。

最後還是把 Connection Pool 設為 False,才解決了連線數量過大的問題。但是採用這種方式時,務必確認所有程式在用完資料庫連線後要關閉連線。而且這種方式由於會頻繁地建立和關閉連 線,因此程式執行效率也會比有啟用 Connection Polling 時慢一滴滴。

.NET 程式還是跟 SQL Server 比較合得來啊 >_<|||

這裡還有一篇關於 ASP.NET 網站效能的文章可以參考:10 Tips for Writing High-Performance Web Applications

此外,關於 connection pool 的建立原則(即什麼情況會使用 pool 中的連線,什麼情況會建立新的 pool),可以參考這篇 MSDN 文章:Using Connection Pooling with SQL Server 。這裡節錄其中一小段關鍵說明:

Connections are pooled per process, per application domain, per connection string and when using integrated security, per Windows identity.

換句話說,只有相同的應用程式、相同的 App Domain、而且是完全相同的連線字串,才會使用同一個 pool。如果應用程式採用 Windows 驗證方式,則每個 user 有各自的 pool。