Bap*_*ptX 8 c# wcf multithreading sqlconnection thread-safety
我有一个Log类将日志放在Windows日志和SQL表中.为了优化我的代码,我想只使用一个SqlConnection.
在MSDN中,它说:public static此类型的任何(在Visual Basic中共享)成员都是线程安全的.任何实例成员都不保证是线程安全的.
我的问题是:
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;
}
Cyb*_*axs 15
这不是共享SqlConnection的常用方法,只应在特殊用例下使用.
首先,您确实知道资源池是用于在使用套接字,网络流,Web服务时提高性能的常见模式......
但是特别是对于SqlConnection,你不必担心这个,因为框架已经为你做了这个,这要归功于 Sql Connection Pool.
每当用户在连接上调用Open时,pooler将在池中查找可用连接.如果池连接可用,则将其返回给调用者,而不是打开新连接.当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是关闭它.一旦连接返回到池,就可以在下一个Open调用中重用它
您可以将SqlConnection视为实际连接的包装器.不要相信实现新的SqlConnection代价高昂:它不是很多,并且许多具有高流量的网站都是用它构建的.
默认策略(至少对于sql server)是它将自动运行.您只需要知道关闭连接(使用使用块).还有许多设置来管理池.
您的代码还包含不正确的错误管理:如果连接中止(DBA,网络故障,...),您将在记录时抛出异常...不理想
为此,我不认为在您的情况下共享SQL连接是合适的.使用异步日志记录库可以获得更多性能.
在确定这是一个真正的问题之前,请不要专注于此.
我们应该忘记小的效率,大约97%的时间说:过早的优化是万恶之源,Donald Knuth