【问题标题】:Using the same open SQL connection from different threads使用来自不同线程的相同打开的 SQL 连接
【发布时间】:2014-12-11 14:37:28
【问题描述】:

我有一个服务器系统,其中有一个开放的 SQL 连接池。请求以不同的线程进入服务器系统。让每个请求线程从池中选择一个打开的 SQL 连接,使用它然后将它返回 - 仍然打开 - 再次返回池是否有任何问题?压缩:是否允许使用来自不同线程的打开的 SQL 连接,或者是否以某种方式打开 SQL 连接与打开它的线程绑定?

【问题讨论】:

标签: sql .net multithreading


【解决方案1】:

不要跨范围共享 SqlConnection 对象,期间。这会产生巨大的麻烦,其中最重要的是在发生错误时将其丢弃并创建一个新的(这会使连接不可用)。这甚至不是特定于多个线程的;即使只有一个线程使用它,但仍试图保持连接已经够糟糕了。

为您执行的每个查询创建一个新的SqlConnection 实例,并在您完成后立即处理它。 SqlConnection 并不代表与服务器的物理连接,它只是来自连接池的连接的句柄(除非你傻到关闭连接池——默认情况下它是打开的)。如果已经有一个开放的物理连接可用(并且池试图确保始终存在一个),那么创建和打开一个非常便宜的操作。

通常,您不需要关心连接池,因为它“正常工作”,但如果您想了解更多(或出于调整目的需要了解更多),请参阅 MSDN 中的“SQL Server Connection Pooling” .

【讨论】:

  • 谢谢。是的,我的问题是关于跨线程重用 SQL 连接,而不是关于连接池。微软的文档对此不是很清楚。所以我会重新设计,所以连接不会跨不同的线程使用
  • @AndersHyldahl:文档总是有样板文件指出实例不是线程安全的(实例 are 线程安全的类是少数)但几乎永远不要记录实例是否具有线程的affinity,因为这是一个更小的少数。如果文档不是更具体,您可以假设您可以使用来自任何线程的实例,只要一次不超过一个线程正在使用它。对于SqlConnection,这一点没有实际意义,因为您没有令人信服的理由来共享实例。
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2019-01-13
  • 1970-01-01
相关资源
最近更新 更多