gpt4 book ai didi

sql-server - 我是否泄漏了 ADO.NET 连接?

转载 作者:行者123 更新时间:2023-12-02 23:18:04 24 4
gpt4 key购买 nike

这是我在 DAL 中的代码示例。所有对数据库存储过程的调用都是这样构造的,并且没有内联 SQL。

Friend Shared Function Save(ByVal s As MyClass) As Boolean

Dim cn As SqlClient.SqlConnection = Dal.Connections.MyAppConnection
Dim cmd As New SqlClient.SqlCommand

Try
cmd.Connection = cn
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "proc_save_my_class"

cmd.Parameters.AddWithValue("@param1", s.Foo)
cmd.Parameters.AddWithValue("@param2", s.Bar)

Return True

Finally
Dal.Utility.CleanupAdoObjects(cmd, cn)
End Try

End Function

这是连接工厂(如果我使用正确的术语):

Friend Shared Function MyAppConnection() As SqlClient.SqlConnection

Dim cn As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionString").ToString)
cn.Open()

If cn.State <> ConnectionState.Open Then
' CriticalException is a custom object inheriting from Exception.
Throw New CriticalException("Could not connect to the database.")
Else
Return cn
End If

End Function

这是 Dal.Utility.CleaupAdoObjects() 函数:

Friend Shared Sub CleanupAdoObjects(ByVal cmd As SqlCommand, ByVal cn As SqlConnection)
If cmd IsNot Nothing Then cmd.Dispose()
If cn IsNot Nothing AndAlso cn.State <> ConnectionState.Closed Then cn.Close()
End Sub

我收到很多“超时已过期。在操作完成之前超时期限已过或服务器没有响应。”用户报告的错误消息。应用程序的 DAL 打开连接、读取或保存数据以及关闭连接。任何连接都不会保持开放状态 - 故意的!

在托管 SQL Server 2000 的 Windows 2000 Server 上没有任何明显的迹象表明存在问题。事件日志中没有任何内容,SQL Server 日志中也没有任何内容。

超时是随机发生的 - 我无法重现。它发生在当天早些时候,系统中只有 1 到 5 个用户。系统中大约 50 个用户也会发生这种情况。对于所有数据库来说,通过性能监视器与 SQL Server 的最多连接约为 74 个。

超时发生在应用程序不同部分的数据库保存和读取的代码中。堆栈跟踪未指向一两个有问题的 DAL 函数。这种事在很多不同的地方都发生过。

我的 ADO.NET 代码似乎能够泄漏连接吗?我搜索了一下,发现如果连接池已满,就会发生这种情况。但是,我没有明确设置任何连接池。我什至尝试增加连接字符串中的连接超时,但超时发生在 300 秒(5 分钟)值之前很久:

<add name="MyConnectionString" connectionString="Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=SSPI;Connection Timeout=300;"/>

我已经完全不知道是什么导致了这些超时问题。任何想法都值得赞赏。

编辑:这是一个 WinForms 应用程序。

最佳答案

检查连接泄漏的一种方法是将最大池大小添加到连接字符串,例如:

"integrated security=SSPI;server=MyHost;Max Pool Size=1;"

在开发中,我通常使用此设置运行(如果应用程序同时使用两个连接,则使用大小 2。)

关于sql-server - 我是否泄漏了 ADO.NET 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2624957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com