【问题标题】:Can an SqlConnection be initially opened?可以初始打开 SqlConnection 吗?
【发布时间】: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


【解决方案1】:

好的,我在框架的其他地方发现了错误(在我之前忽略的特殊情况下,打开的连接被传递给方法),因为我无法重现上述情况,其他人似乎也没有能够重现它,我敢说:

不,您无法从池中获取最初打开的连接。

【讨论】:

  • 我应该把我的评论作为答案:)
  • @jgauffin - 嘿,全大写的喊叫是故意的! XD
  • @Paddy - 好吧,做吧。无论如何,我不会因为接受我自己的答案而得到任何代表,所以不妨把它交给别人。 :)
  • @Vilx-:大喊大叫让我头疼。我只想要那些喝得太多的。
  • 啊,不,这不是一个真正的答案——你的答案实际上回答了你的问题,所以最好离开。谢谢你。
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多