最佳做法是跨多个线程使用静态数据库连接吗?

时间:2014-07-15 21:13:44

标签: c# database multithreading sql-server-2012 backgroundworker

对于(1)使用单个,共享,静态连接到SQL数据库或(2)的多线程应用程序是否是最佳实践,是否有任何共识? )为每个BackgroundWorker打开自己与数据库的唯一连接?

我显然假设每个线程都需要连接到同一个数据库。

使用类型是否会影响答案?例如,如果每个线程只运行SELECT语句怎么办?或者,如果某些线程也可以执行UPDATE语句?或者用法并没有真正有所作为,你应该总是/永远不共享静态连接?

2 个答案:

答案 0 :(得分:7)

正如您对问题的评论所讨论的那样。最好的做法是将连接处理留给ADO.Net,因为它包含连接池控制,所以你应该做的就是每次需要执行一些SQL然后关闭它时打开一个连接。连接池不会立即关闭连接,因为它会使其保持打开状态以便配置时间能够将其传递给其他请求打开新连接的线程。此外,连接不是线程安全的,因此每个线程都应该连接,但ADO.Net将再次处理它。

如果您想了解有关连接池的更多信息,请参阅以下MSDN文章:http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx

我还强烈建议您在此处阅读微软的ado .net最佳做法:http://msdn.microsoft.com/en-us/library/ms971481.aspx

其他一些文章:

答案 1 :(得分:6)

来自DbConnection(或SqlConnection)文档:

  

线程安全

     

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全

因此连接对象不是线程安全的,这意味着您不应跨多个线程共享连接实例。