資料庫連線釋放問題引起的“與伺服器的連線被重置”
阿新 • • 發佈:2019-02-18
最近在業務系統中寫了個下載檔案的介面,供公司的其他工具下載業務系統中的檔案。結果在下載檔案時發現,檔案下載了一部分就無法再下載。系統提示“與伺服器的連線被重置” 。有時候甚至不會提示 ,IE的儲存進度框會突然消失不見。
一開始以為是C#.NET或者IIS的問題。因為在本機VS2010裡除錯時沒有任何問題,檔案能順利下載。
因為在伺服器上開啟IE下載也不行,所以可以排除網路和防火牆問題。
求助度娘和谷哥了大半天,沒有找到任何能解決我問題的方法。
自己在業務系統中寫的除錯日誌也沒起什麼作用,出問題的程式碼位置似乎有些隨機性。
後來看了伺服器的系統日誌,發現了以下錯誤:
發生未處理的異常,並已終止程序。 Application ID: /LM/W3SVC/6/ROOT Process ID: 316 Exception: System.InvalidOperationException Message: 內部 .Net Framework 資料提供程式錯誤 1。 StackTrace: 在 System.Data.ProviderBase.DbConnectionInternal.PrePush(Object expectedOwner) 在 System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject) 在 System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlInternalConnection.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Close() 在 System.Data.SqlClient.SqlConnection.Dispose(Boolean disposing) 在 System.ComponentModel.Component.Dispose() 在 BLL.DataConnection.Finalize()
然後又通過遮蔽不同位置的程式碼,終於定位到了錯誤:
ProcedureBLL b = new ProcedureBLL(new DataConnection());
//其他程式碼……
正確寫法應該為:using (DataConnection c = new DataConnection())
{
ProcedureBLL b = new ProcedureBLL(c);
//其他程式碼……
}
這次的問題是由於資料庫連線未及時被釋放引起的。