1. 程式人生 > >資料庫連線釋放問題引起的“與伺服器的連線被重置”

資料庫連線釋放問題引起的“與伺服器的連線被重置”

        最近在業務系統中寫了個下載檔案的介面,供公司的其他工具下載業務系統中的檔案。結果在下載檔案時發現,檔案下載了一部分就無法再下載。系統提示“與伺服器的連線被重置” 。有時候甚至不會提示 ,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);
    //其他程式碼…… 
}   

        這次的問題是由於資料庫連線未及時被釋放引起的。