C# 跨多个线程使用静态数据库连接是最佳做法吗?
对于多线程应用程序使用到SQL数据库的单一、共享、静态连接(1)还是每个BackgroundWorker打开自己到数据库的唯一连接(2),大家是否有共识 我显然假设每个线程都需要连接到同一个数据库 使用类型会影响答案吗?例如,如果每个线程都只运行SELECT语句呢?或者一些线程是否也可以执行UPDATE语句?或者,这种用法真的没有什么区别吗?不管怎样,您都应该/永远不要共享静态连接?来自(或)文档: 线程安全 此类型的任何公共静态(在Visual Basic中共享)成员都是 线程安全。不保证任何实例成员都是线程 安全的C# 跨多个线程使用静态数据库连接是最佳做法吗?,c#,database,multithreading,sql-server-2012,backgroundworker,C#,Database,Multithreading,Sql Server 2012,Backgroundworker,对于多线程应用程序使用到SQL数据库的单一、共享、静态连接(1)还是每个BackgroundWorker打开自己到数据库的唯一连接(2),大家是否有共识 我显然假设每个线程都需要连接到同一个数据库 使用类型会影响答案吗?例如,如果每个线程都只运行SELECT语句呢?或者一些线程是否也可以执行UPDATE语句?或者,这种用法真的没有什么区别吗?不管怎样,您都应该/永远不要共享静态连接?来自(或)文档: 线程安全 此类型的任何公共静态(在Visual Basic中共享)成员都是 线程安全。不保证任何
因此,连接对象不是线程安全的,这意味着您不应该跨多个线程共享连接实例 如您对问题的评论所述。最好的做法是将连接处理留给ADO.Net,因为它包含连接池控制,所以您所要做的就是在每次需要执行一点SQL时打开一个连接,然后关闭它。连接池不会立即关闭连接,因为它会在可配置的时间内保持连接打开,以便能够将其传递给请求打开新连接的其他线程。另外,连接不是线程安全的,所以每个线程都应该有自己的on连接,但ADO.Net会处理这个问题 如果您想了解有关连接池的更多信息,我建议您阅读以下MSDN文章: 我还强烈建议您在此处阅读Microsofts针对ado.net的最佳实践: 其他一些条款:
- ADO.Net最佳实践
- 值得一读的是,用于改进.Net应用程序的企业模式和实践在ADO.Net上有很大的作用: