2013-05-27 38 views
0

如果我箱子一個static DB ConnectionC# Web serviceC#的Web服務和靜態DB連接

連接的此實例上的Web服務的所有istance共享?那麼,這樣我可以解決一些問題嗎?

不允許改變 '的ConnectionString' 屬性,而 連接(狀態=連接)

我得到的情況下以這樣的方式

public static OleDbConnection GetDatabaseConnection(string aConnectionString) 
    { 
    if (_dbConnection == null) 
    { 
    _dbConnection = new OleDbConnection(aConnectionString); 
    _dbConnection.Open(); 
    } 
    else 
    { 
    _dbConnection.Close(); 
    _dbConnection = new OleDbConnection(aConnectionString); 
    _dbConnection.Open(); 
    } 
    Log.Logger.log("Aperta connessione al DB"); 
    return _dbConnection; 
    } 
+0

哪一行引發此異常。順便說一句:如果兩個併發服務電話發生了什麼?雖然其中一個做一些數據庫操作,看起來像其他請求會關閉它的連接。 –

回答

4

它始終是一個不好的做法,以保持一個全球性的連接實例。您應該遵循標準模式:create, open, use, close and destroy
與此相反,遲早會出現問題。
Connection Pooling機制已被研究。
池將幫助你避免這種不良習慣,以保持一個對象這麼貴像一個數據庫連接打開不可預見的時間

public static OleDbConnection GetDatabaseConnection(string aConnectionString) 
{ 
    OleDbConnection odb = new OleDbConnection(aConnectionString); 
    odb.Open(); 
    Log.Logger.log("Aperta connessione al DB"); 
    return odb; 
} 

那麼你的客戶端代碼中使用using statement關閉和破壞連接

using(OleDbConnection cn = SqlClassHelper.GetDatabaseConnection(constring)) 
{ 

    // define here your OleDbCommand, OleDbDataReader etc... 
    // use the objects 

} // <- here the closing brace close and destroy the connection 
+0

+1提連接池。 – uriDium

1

是的,你將有您的代碼在多線程Web服務中出現問題。

您的功能GetDatabaseConnection就像工廠一樣工作,每個調用它的人都會獲得一個新的連接實例。你不需要靜態_dbConnection類的成員,只是讓一個局部變量:

public static OleDbConnection GetDatabaseConnection(string aConnectionString) 
    { 
    OleDbConnection _dbConnection = new OleDbConnection(aConnectionString); 
    _dbConnection.Open(); 
    Log.Logger.log("Aperta connessione al DB"); 
    return _dbConnection; 
    }