内部连接致命错误

时间:2012-07-11 10:52:18

标签: .net sql-server

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

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

这是堆栈strace:

Internal connection fatal error.

-------------- Stack trace ---------------
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.IntentionalRethrow(Exception chainException, Exception originalException)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.RethrowRecommended(Exception chainException, Exception originalException)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.Handle(Exception exceptionToHandle)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl.HandleException(Exception exceptionToHandle)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName, ExceptionPolicyFactory policyFactory)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName)
   at Base.Sql.ExecuteScalar()

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

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

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

4 个答案:

答案 0 :(得分:7)

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

我认为这里有一些问题。

  • 跨线程重用开放连接。
  • 跨线程重用sql客户端对象。
  • 没有正确关闭打开的连接 - 您是使用using
  • 包装连接创建的吗?

提供代码示例,我们或许可以发现问题......

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

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

所以我们做了什么,我们用“使用”替换了相同的东西,并将整个东西保持在括号内。

使用(DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings [“DBConnect”]。ConnectionString))             { 此处的代码              --- if(DBConn.State!= ConnectionState.Open)                     DBConn.Open();

}

这完全解决了这个问题。

希望这有帮助。

答案 3 :(得分:0)

对于.NET Core 2.0或更高版本,当.csproj文件中包含以下内容时,也会发生错误:

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

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

相关问题