【问题标题】:Is it best practice to use a static database connection across multiple threads?跨多个线程使用静态数据库连接是最佳实践吗?
【发布时间】:2014-07-15 21:13:44
【问题描述】:

对于多线程应用程序的最佳做法是(1) 使用到 SQL 数据库的单个共享静态连接还是 (2 ) 让每个 BackgroundWorker 打开自己唯一的数据库连接?

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

使用类型会影响答案吗?例如,如果每个线程只运行 SELECT 语句怎么办?或者如果某些线程也可以执行 UPDATE 语句?或者使用情况并没有真正产生影响,无论如何您都应该/永远不要共享静态连接?

【问题讨论】:

  • 最好使用连接池,所有线程安全都已经完成。迄今为止最好的选择。
  • 当然,即使使用它,您仍然可以获得表锁。对你的数据库脚本要聪明一点。 sql sever 也有很好的并发处理方式
  • 后台线程上的多个独立并发连接听起来确实很可怕。
  • 哪个数据库?有些,如 MS Access 或 Jet,无法处理并发更新。请注意,您不需要静态连接来序列化并发更新。
  • 具体来说是 SQL Server 2012!

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


【解决方案1】:

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

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

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

其他一些文章:

【讨论】:

    【解决方案2】:

    来自DbConnection(或SqlConnection)文档:

    线程安全

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

    所以一个连接对象不是线程安全的,这意味着你不应该在多个线程之间共享一个连接实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2016-04-06
      • 2013-07-07
      • 2017-06-24
      相关资源
      最近更新 更多