繁体   English   中英

SqlConnection 线程安全?

[英]SqlConnection Thread-Safe?

我有一个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;
}

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

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

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

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

您可以将 SqlConnection 视为真实连接的包装器。 不要相信实例化一个新的 SqlConnection 成本很高:事实并非如此,许多高流量的网站都是用它构建的。

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

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

最后,我认为共享 sql 连接不适合您的情况。 使用异步日志库,您将获得更多性能。

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

我们应该忘记小效率,比如大约 97% 的时间:过早的优化是万恶之源, Donald Knuth

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM