【发布时间】:2012-03-23 09:17:03
【问题描述】:
我正试图找出我的应用程序中的一个奇怪错误。这是“生产中每月仅出现一次不可重现”类型的错误之一。我已经倾注了代码,目前我最好的猜测是 SqlConnection 正在以某种方式被打开。那就是:
var conn = new System.Data.SqlClient.SqlConnection(@"Data Source=MyComputer;User ID=sa;Password=sa");
// conn.State == ConnectionState.Open here
现在,我不能以任何方式刻意重现这种情况,所以问题是 - 是否存在某种异常情况,在这种情况下上述情况可能成立;还是我应该继续在其他地方寻找错误?
【问题讨论】:
-
这种类型的连接有可能在高负载下从内部连接池返回?创建一个同时打开并使用大量连接的测试平台。很多时候,连接不是“创建”的,而是从内部池“借来的”,就像
ThreadPool。机会很小,但它可能是内部的一个错误,它会将已释放的连接放回池中而没有完全关闭它们 - 代码审查以确保所有连接也在您的代码中关闭。 -
@AdamHouldsworth - 我正在尝试使用池大小为 1 进行此操作。我已经验证我确实一次只能打开一个连接,但处理和重新打开仍然会产生“关闭”状态。
-
是什么让你认为是这种情况——你有错误报告吗?
-
@Vilx- 我的重点是你可能有代码没有关闭连接,但是已经完成了。或者内部存在竞争条件,这意味着连接在池关闭之前已发出。其中大多数是极不可能的,但你的错误也是如此。不要将您的测试限制在有限的池大小,我会尝试复制生产环境。将池大小保留为默认值,只需在几个线程上运行大量连接。
-
说实话 - 我可能不会太努力地追逐这条小巷。根据我的经验,当你发生“不可能”的事情时,这通常是我做过的事情,而不是框架中的一个基本错误......(虽然有时是这样,但对于如此广泛的使用 sn-p 的代码是这样的错误)。
标签: .net sql-server sqlconnection