最近發現了一個之前開發過的網站,大約兩、三天就會發生「已經開啟一個與這個 Command 相關的 DataReader,必須先將它關閉。」的錯誤訊息,
整個網站可以正常編譯,代表語法沒問題,測試的時候可以正常執行也不會發生 Exception,但只要一到了客戶那邊的主機執行個幾天就會開始出現問題,
但通常多 reload 幾次網頁就會正常執行就好了,完全是一個很詭異的狀況。
==========================================================================================================================
首先有個很重要的觀念需要說明,若你在 ASP.NET 中使用靜態欄位(static field)的話,這個靜態欄位物件會一直留存在 ASP.NET 的應用程式中 (HttpApplication),
也就是說當 ASP.NET 頁面處理完成之後,該物件還是一樣存在 HttpApplication 中,並且所有 HTTP Request 都會共用這個靜態欄位變數,
所以只要網站流量變多的時候就很有可能會發生資源衝突的情況,導致 TableAdapter 在進行資料處理的時候因為只共用一條連線,而造成連線狀態彼此衝突而混亂的情況。
我個人在寫 ASP.NET 就是因為知道會有這種狀況,所以本身就很少用 static 宣告變數,除非你真的很清楚使用 static 變數的時機與潛在會發生的問題,就可以大膽去用啦。