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

C# 跨多个线程使用静态数据库连接是最佳做法吗?,c#,database,multithreading,sql-server-2012,backgroundworker,C#,Database,Multithreading,Sql Server 2012,Backgroundworker,对于多线程应用程序使用到SQL数据库的单一、共享、静态连接(1)还是每个BackgroundWorker打开自己到数据库的唯一连接(2),大家是否有共识 我显然假设每个线程都需要连接到同一个数据库 使用类型会影响答案吗?例如,如果每个线程都只运行SELECT语句呢?或者一些线程是否也可以执行UPDATE语句?或者,这种用法真的没有什么区别吗?不管怎样,您都应该/永远不要共享静态连接?来自(或)文档: 线程安全 此类型的任何公共静态(在Visual Basic中共享)成员都是 线程安全。不保证任何

对于多线程应用程序使用到SQL数据库的单一、共享、静态连接(1)还是每个BackgroundWorker打开自己到数据库的唯一连接(2),大家是否有共识

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

使用类型会影响答案吗?例如,如果每个线程都只运行SELECT语句呢?或者一些线程是否也可以执行UPDATE语句?或者,这种用法真的没有什么区别吗?不管怎样,您都应该/永远不要共享静态连接?

来自(或)文档:

线程安全

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


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

如您对问题的评论所述。最好的做法是将连接处理留给ADO.Net,因为它包含连接池控制,所以您所要做的就是在每次需要执行一点SQL时打开一个连接,然后关闭它。连接池不会立即关闭连接,因为它会在可配置的时间内保持连接打开,以便能够将其传递给请求打开新连接的其他线程。另外,连接不是线程安全的,所以每个线程都应该有自己的on连接,但ADO.Net会处理这个问题

如果您想了解有关连接池的更多信息,我建议您阅读以下MSDN文章:

我还强烈建议您在此处阅读Microsofts针对ado.net的最佳实践:

其他一些条款:

  • ADO.Net最佳实践
  • 值得一读的是,用于改进.Net应用程序的企业模式和实践在ADO.Net上有很大的作用:

最好使用连接池—所有线程安全性都已在该连接池上完成。到目前为止,这是最好的选择。当然,即使使用它,您仍然可以获得表锁。只要对你的数据库脚本保持聪明就行了。另外,sql Server有一个很好的处理并发的方法。后台线程上的多个独立并发连接听起来很可怕。哪个数据库?有些,如MS Access或Jet,无法处理并发更新。请注意,您不需要静态连接来序列化并发更新。具体请参见SQL Server 2012!