13

我最近开始从我的应用程序中收到此错误:“内部连接致命错误”。错误随机发生。当它发生时,我的应用程序在接下来的几分钟内无法使用。

在仔细分析错误后,我得出结论,此错误仅发生在我的应用程序中的一种方法中。此方法触发一系列简单的普通 SQL 查询,但它确实涉及多线程,但是所有线程都应在此代码块之前处理。错误总是发生在特定的 SQL 查询上。对于测试,我已经消除了这个导致下一行查询发生错误的查询。

这是堆栈跟踪:

内部连接致命错误。

-  -  -  -  -  -  -  堆栈跟踪  -  -  -  -  -  -  - -
   在 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.IntentionalRethrow(异常链异常,异常 originalException)
   在 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.RethrowRecommended(异常链异常,异常 originalException)
   在 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.Handle(异常 exceptionToHandle)
   在 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl.HandleException(异常 exceptionToHandle)
   在 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(异常 exceptionToHandle,字符串 policyName,ExceptionPolicyFactory policyFactory)
   在 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(异常 exceptionToHandle,字符串策略名称)
   在 Base.Sql.ExecuteScalar()

应用程序建立在 .NET 3.5 之上,它显然使用企业库数据访问。应用程序在 Win2003 终端服务器上运行,它使用不同服务器上的 Sql Server 2005 数据库。

导致此错误的方法不是从 GUI 触发的,而是从命令行触发(如果这有任何意义)。

如果有人建议从这里去哪里,我将非常感激。

4

4 回答 4

13

我遇到了类似的问题,并且在这个问题上花了很多时间。因此,您需要一一检查以下所有内容。

  1. 在调用存储过程之前,您可能已经留下了一些与数据库的开放连接。
  2. 调用 SqlDataReader.Close() 或 SqlDataReader.Dispose() 时出现此异常 - 可以使用 SqlConnection.Close() 而不是 SqlDataReader.Close() 来修复
  3. 删除您的临时文件夹?
  4. 查看 IIS 服务器对临时端口的使用情况。默认最大数量 可用端口数通常为 4000。如果您的应用程序进行大量数据库调用,您可以增加它。

让我知道它是否没有帮助。我可能有机会学习新的东西。

于 2012-07-17T19:40:10.510 回答
9

像这样的奇怪错误通常是多线程访问非线程安全对象的结果。

我认为这里有几件事出了问题。

  • 跨线程重用打开的连接。
  • 跨线程重用 sql 客户端对象。
  • 未正确关闭打开的连接 - 您是否使用using?

提供一个代码示例,我们也许能够发现问题......

于 2012-07-16T08:16:10.190 回答
1

我和我的团队已经被这个问题困扰了很长一段时间。我们尝试实现一切,从 try-catch-finally 到维护所有编码标准;但是,每当多个用户尝试同时访问该页面时,此问题就会不断发生。连接会中断并出现问题。有时我们甚至必须重新启动整个服务器才能使应用程序开始工作。问题是我们无法限制用户使用相同的连接字符串,从而引发此错误。最终,我们尝试使用“using”打开和关闭连接字符串,之前我们在 dataadapter 能够获取数据之后使用“dbcon.opne()”和“dbcon.close()”手动打开和关闭它。

所以我们做了什么,我们用“使用”替换了同样的东西,这让整个事情都在括号内。

使用 (DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnect"].ConnectionString)) { 这里的代码 --- if (DBConn.State != ConnectionState.Open) DBConn.Open();

}

这彻底解决了问题。

希望这可以帮助。

于 2016-02-11T10:52:22.963 回答
0

对于 .NET Core 2.0 或更高版本,当您的 .csproj 文件中有以下内容时,也可能会发生该错误:

 <ItemGroup>
   <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" /> 
 </ItemGroup> 

根据文档,此选项“使您能够删除应用程序对全球化数据和全球化行为的依赖”。除了较小的文件大小之外,我不知道这样做的好处是什么,但 SqlConnection 不适用于它。

于 2019-08-21T12:28:35.990 回答