2014-02-12 34 views
7

我在Google上搜索了我的問題,但我沒有找到任何有關此問題的解決方案。SqlConnection線程安全?

我有一個日誌類將日誌放入Windows日誌和SQL表中。爲了優化我的代碼,我想只使用一個SqlConnection。

在MSDN中,它表示:此類型的任何公共靜態(Visual Basic中的Shared)成員都是線程安全的。任何實例成員不保證是線程安全的。

我的問題是:

private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 

是線程安全的?如果是,當使用Open()和Close()時?

如果沒有,如何正確使用SqlConnection?

這裏是我滿級代碼:

private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 

public static long WriteLog(string sSource, string sMessage, int iErrorCode, EventLogEntryType xErrorType) 
{ 
    // Windows Logs 
    if (ConfigParameters.Instance.WindowsLog) 
     EventLog.WriteEntry(sSource, sMessage, xErrorType, iErrorCode); 

    // SQL Logs 
    // TODO 

    return 0; 
} 

感謝提前:)

+0

我發現這一點:HTTP:// WWW。 codeproject.com/Articles/62249/Connection-Pooling-in-multithreaded-applications它可以是一個解決方案? – BaptX

+1

爲什麼你只想使用一個連接?這將增加您的開銷以防止線程問題。 ADO.NET已經具有內置的連接池,並且可以通過將'use'語句包裝到一個給定連接的時間來最小化它。 – Tim

+0

另外,這與WCF無關,因此您可以刪除該標籤。 – Tim

回答

12

這不是共享一個SqlConnection一種常見的方式,只有在特殊情況下使用它應該被使用。

首先,你真的,資源池是用來與插座,網絡流,Web服務工作時來提高性能的通用模式...

但尤其是對的SqlConnection,你不必擔心關於這個,因爲框架已經爲你做了這個,感謝Sql Connection Pool

每當用戶在連接上調用Open時,池就會在池中查找可用連接 。如果有連接池, 它將它返回給調用者而不是打開一個新的連接。當 應用程序在連接上調用Close時,池會將其 返回到活動連接的池集,而不是關閉它。一旦 連接返回到池中,它準備在 下一Open調用

你可以考慮的SqlConnection圍繞實際連接的包裝可以重複使用。不要相信,實例化一個新的SqlConnection代價高昂:它並不是很多網站都是使用它創建的。

默認策略(對於sql server至少)是它會自動工作。你只需要知道關閉你的連接(使用塊)。還有許多設置來管理池。

您的代碼還包含一個不正確的錯誤管理:如果連接被中止(DBA,網絡故障,...),您將登錄時拋出異常......不理想

在爲此,我不你認爲共享一個SQL連接適合你的情況。使用異步日誌庫可以獲得更多的性能。

現在不要專注於此,除非您確定這是一個真正的問題。

我們應該忘記小的效率,說約97%的時間: 過早的優化是所有罪惡的根源,高德納

+0

我把方法中的SqlConnection :) – BaptX