Kir*_*amy 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
Run Code Online (Sandbox Code Playgroud)
这在程序的正常执行期间完美地工作.但是,应用程序的一些部分以多线程方式执行.当其中一个部件正在执行时,如果进行其他操作,则会发生频繁的错误.
在挖掘了一下之后,我意识到这是因为有时两个不同的线程都试图使用同一个SqlConnection
对象.
因此,在确定问题后,我现在需要找到解决方案.显而易见的解决方案是SqlConnection
每次数据库调用需要时重新创建对象 - 在这种情况下,它永远不会被共享.有什么理由不这样做吗?我原先认为出于性能原因,每个应用程序会话只有一个连接对象,但实际情况如此吗?
如果我们确实需要保持一个连接对象打开,建议的解决方案是什么?我应该安装某种计时器,它会一直循环,直到连接对象可用,然后访问它?
Jon*_*eet 25
显而易见的解决方案是每次数据库调用需要时重新创建SqlConnection对象 - 在这种情况下,它永远不会被共享.有什么理由不这样做吗?
相反,这绝对是你应该做的.这就是SqlConnection
为此而设计的行为.您应该使用Using
语句在您正在使用它的块的末尾自动关闭连接,并且连接池机制将自动处理与数据库的真实底层连接.
我认为没有理由不在每次需要时创建 SQL 连接。事实上,这可能是最好的方法,因为它为 .NET 框架提供了最有效地管理和重用连接的灵活性。将每个 SQL 连接包装在 USING 中,以便尽可能短地保留它们。
我们创建了一个创建连接的方法,每个人都使用它:
using (var conn = GetConnection())
using (var proc = GetProcedure(conn, "procname"))
using (var reader = proc.GetReader())
{
... DB stuff
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8709 次 |
最近记录: |