【发布时间】:2014-05-30 04:54:56
【问题描述】:
我们有一个使用 SQL Server 2008 R2 数据库的应用程序。在应用程序中,使用SqlConnection 对象调用数据库。
这个SqlConnection 对象被初始化一次,第一次被访问,然后在整个应用程序中重新使用。我们使用的操作如下:
Protected _cn As SqlConnection = Nothing
...
Protected Sub Open()
If _cn Is Nothing Then
_cn = New SqlConnection(_sqlConn)
End If
If _cn.State = ConnectionState.Closed OrElse _cn.State = ConnectionState.Broken Then
_cn.Open()
End If
End Sub
这在程序的正常执行期间工作得非常好。但是,应用程序的某些部分以多线程方式执行。当执行这些部分之一时,如果执行其他操作,则会经常发生错误。
经过一番挖掘,我意识到这是因为有时两个不同的线程都试图使用同一个 SqlConnection 对象。
所以,在确定了问题之后,我现在需要找到解决方案。显而易见的解决方案是在每次数据库调用需要一个对象时重新创建SqlConnection 对象——在这种情况下,它永远不会被共享。有什么理由不这样做吗?出于性能原因,我最初假设应用程序的每个会话只有一个连接对象,但实际上是这样吗?
如果我们确实需要只打开一个连接对象,建议的解决方案是什么?我应该设置某种计时器,它会一直循环直到连接对象可用,然后访问它?
【问题讨论】:
-
如果线程的性质是它多次调用数据库然后线程关闭,您可能希望在线程中保持连接打开并用线程关闭它。确保不要跨线程共享连接。
标签: .net sql-server multithreading connection-pooling