我有一个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;
}发布于 2014-02-14 17:08:41
这不是一种共享SqlConnection的常见方式,应该只在特殊情况下使用。
首先,在使用套接字、网络流、web服务时,资源池是一种用于提高性能的常见模式,这是事实。
但由于有了Sql Connection Pool,特别是对于SqlConnection,您不必担心这一点,因为框架已经为您做了这件事。
每当用户对连接调用打开时,池程序都会在池中查找可用的连接。如果池连接可用,则将其返回给调用方,而不是打开新连接。当应用程序对连接调用Close时,池程序会将其返回到活动连接的池化集,而不是关闭它。一旦连接返回到池中,就可以在下一次Open调用中重用它
您可以将SqlConnection视为实际连接的包装器。不要相信实例化一个新的SqlConnection是很昂贵的:它并不昂贵,许多高传输率的网站都是用它构建的。
默认策略(至少对于sql server )是它将自动工作。你只需要注意关闭你的连接(使用using块)。还有许多用于管理池的设置。
您的代码还包含一个不正确的错误管理:如果连接中止(DBA、网络故障...)您将在记录时抛出异常...不理想
在这种情况下,我认为共享sql连接对您来说并不合适。使用异步日志库,您将获得更多性能。
在你确定这是一个真正的问题之前,不要专注于这个问题。
我们应该忘记小效率,比如说97%的时间:过早优化是一切邪恶的根源,Donald Knuth
https://stackoverflow.com/questions/21731641
复制相似问题