.NET,SqlConnection对象和多线程

时间:2014-05-29 20:28:11

标签: .net sql-server multithreading connection-pooling

我们有一个使用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对象 - 在这种情况下,它永远不会被共享。 是否有任何理由这样做?我原先认为出于性能原因,每个应用程序会话只有一个连接对象,但实际情况如此吗?

如果我们确实需要保持一个连接对象打开,建议的解决方案是什么?我应该放置某种定时器,它会一直循环直到连接对象可用,然后访问它吗?

2 个答案:

答案 0 :(得分:25)

  

显而易见的解决方案是每次数据库调用需要时重新创建SqlConnection对象 - 在这种情况下,它永远不会被共享。有没有理由不这样做?

相反,那绝对你应该做什么。这就是SqlConnection设计的行为。您应该使用Using语句在您正在使用它的块的末尾自动关闭连接,并且连接池机制将自动处理与数据库的真实底层连接。

答案 1 :(得分:3)

我认为没有理由不在每次需要时创建SQL连接。实际上,这可能是最好的方法,因为它为.NET框架提供了最有效地管理和重用连接的灵活性。在USING中包装每个SQL连接,以便在尽可能短的时间内连接它们。

我们创建了一个创建连接的方法,每个人都使用它:

using (var conn = GetConnection())
    using (var proc = GetProcedure(conn, "procname"))
        using (var reader = proc.GetReader())
        {
            ... DB stuff
        }