SqlConnection线程安全吗?

时间:2014-02-12 15:06:58

标签: c# multithreading wcf thread-safety sqlconnection

我有一个Log类,它将日志放在Windows日志和SQL表中。为了优化我的代码,我只想使用一个SqlConnection

在MSDN中,它说:此类型的任何public static(在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;
}

1 个答案:

答案 0 :(得分:15)

这不是共享SqlConnection的常用方法,只应在特殊用例下使用。

首先,您确实知道资源池是用于在使用套接字,网络流,Web服务时提高性能的常见模式......

但是特别是对于SqlConnection,你不必担心这个,因为框架已经为你做了这个,感谢Sql Connection Pool

  

每当用户在连接上调用Open时,pooler会查找   池中的可用连接。如果有可用的池连接,   它将它返回给调用者而不是打开新连接。什么时候   应用程序在连接上调用Close,pooler返回它   汇集到一组活动连接而不是关闭它。一旦   连接返回到池中,可以重新使用它   下一次公开招募

您可以将SqlConnection视为真实连接的包装器。不要相信实现新的SqlConnection代价高昂:它不是很多,并且许多具有高流量的网站都是用它构建的。

默认策略(至少对于sql server)是它将自动运行。您只需要知道关闭连接(使用使用块)。还有许多设置来管理池。

您的代码还包含错误的错误管理:如果连接中止(DBA,网络故障,...),您将在记录时抛出异常...不理想

为此,我不认为在您的情况下共享SQL连接是合适的。使用异步日志记录库可以获得更多性能。

在确定这是一个真正的问题之前,请不要专注于此。

  

我们应该忘记效率低,大约97%的时间说:   过早优化是所有邪恶的根源, Donald Knuth