首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlConnection线程安全?

SqlConnection线程安全?
EN

Stack Overflow用户
提问于 2014-02-12 23:06:58
回答 1查看 14.5K关注 0票数 9

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

在MSDN中,它说明:此类型的任何public static (在Visual Basic中为Shared)成员都是线程安全的。不能保证任何实例成员都是线程安全的。

我的问题是:

代码语言:javascript
复制
private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection);

它是线程安全的吗?如果是,则在使用Open()Close()

如果没有,如何正确使用SqlConnection

下面是我的完整类代码:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 17:08:41

这不是一种共享SqlConnection的常见方式,应该只在特殊情况下使用。

首先,在使用套接字、网络流、web服务时,资源池是一种用于提高性能的常见模式,这是事实。

但由于有了Sql Connection Pool,特别是对于SqlConnection,您不必担心这一点,因为框架已经为您做了这件事。

每当用户对连接调用打开时,池程序都会在池中查找可用的连接。如果池连接可用,则将其返回给调用方,而不是打开新连接。当应用程序对连接调用Close时,池程序会将其返回到活动连接的池化集,而不是关闭它。一旦连接返回到池中,就可以在下一次Open调用中重用它

您可以将SqlConnection视为实际连接的包装器。不要相信实例化一个新的SqlConnection是很昂贵的:它并不昂贵,许多高传输率的网站都是用它构建的。

默认策略(至少对于sql server )是它将自动工作。你只需要注意关闭你的连接(使用using块)。还有许多用于管理池的设置。

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

在这种情况下,我认为共享sql连接对您来说并不合适。使用异步日志库,您将获得更多性能。

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

我们应该忘记小效率,比如说97%的时间:过早优化是一切邪恶的根源,Donald Knuth

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21731641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档