内部连接致命错误

13

我最近开始收到这个错误:“内部连接致命错误”,这是来自我的应用程序。错误会不定期地发生,当它发生时,我的应用程序在接下来的几分钟内无法使用。

仔细分析错误后,我得出结论:这个错误只发生在我的应用程序中的一个方法中。该方法触发一系列简单的普通SQL查询,但涉及多线程,但是所有线程在此代码块之前都应该被销毁。该错误总是发生在特定的SQL查询上。为了进行测试,我删除了这个查询,结果错误发生在下一个查询中。

以下是堆栈跟踪:

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上,并且显然使用Enterprise Library Data Access。 应用程序在Win2003终端服务器上运行,它使用的是位于不同服务器上的Sql Server 2005数据库。

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

如果有人能够建议我接下来该怎么做,我将非常感谢。


1
你说多线程?你确定连接和其他相关对象没有跨线程使用吗?这将是不好的。 - Chris Moutray
错误发生在方法的多线程部分之后。 - Nezreli
2
也许提供您的应用程序/连接的示例代码。 - Chris Moutray
是否存在基础的 SqlException(请参见“递归”InnerException属性)? - Rudi
4个回答

13

我曾经遇到过类似的问题并为此付出了相当长的时间。因此,您需要逐一检查以下所有内容。

  1. 在调用存储过程之前,您可能已经让一些数据库连接处于打开状态。
  2. 调用SqlDataReader.Close()或SqlDataReader.Dispose()时会出现此异常 - 使用SqlConnection.Close()来代替SqlDataReader.Close()可以解决这个问题。
  3. 删除临时文件夹?
  4. 查看IIS服务器使用短暂端口的情况。默认可用的最大端口号通常为4000。如果您的应用程序正在进行大量的数据库调用,则可以增加它们。

如果这没有帮助到您,请告诉我。我可能有机会学习到一些新东西。


1
  1. Enterprise library 处理连接。
  2. 在堆栈跟踪中,您可以看到正在调用 ExecuteScalar。
  3. 请澄清。
  4. 这是一个 Windows Forms 应用程序。
- Nezreli
你的代码是否使用了类似以下的内容...... string connStr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings[companyCode].ConnectionString; SqlDatabase db = new SqlDatabase(connStr); DbCommand dbCommand = db.GetStoredProcCommand("SPNAME"); db.AddInParameter(dbCommand, "@ConfigKey", DbType.String, "ParameterName");return (string)db.ExecuteScalar(dbCommand); - NG.
不,企业库增加了另一层抽象,使我的代码与数据库无关。但是,在概念上使用方式类似。 - Nezreli
我所说的临时文件夹是指在C盘中创建的ASP.NET临时文件夹。 - NG.

9
奇怪的错误通常是由于多线程访问不安全的对象导致的。我认为这里有几个问题:
1. 在线程之间重用打开的连接。 2. 在线程之间重用 SQL 客户端对象。 3. 没有正确关闭打开的连接 - 你是否在连接创建时使用了“using”?
提供一个代码示例,我们可能能够找到问题...

企业库处理连接。不幸的是,代码过于复杂,我无法使用简化版本重现问题。 - Nezreli

1
I和我的团队一直被这个问题困扰了很长时间。我们尝试了实现所有编码标准,从try-catch-finally到维护,但是每当多个用户同时尝试访问页面时,这个问题就会发生。连接会断开,问题也会出现。有时我们甚至不得不重新启动整个服务器才能使应用程序开始工作。问题在于我们无法限制用户使用相同的连接字符串,从而引发此错误。最后,我们尝试使用“using”打开和关闭connectionstring,在数据适配器能够获取数据之后,我们以前是手动使用“dbcon.opne()”和“dbcon.close()”来打开和关闭它。
所以我们做的是,用“using”替换了同样的东西,并将整个东西保留在括号内。
使用(DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnect"].ConnectionString)) { 这里是代码 --- if (DBConn.State != ConnectionState.Open) DBConn.Open(); }

}

这完全解决了问题。 希望这能帮到你。

1

对于 .NET Core 2.0 或更高版本,当您的 .csproj 文件中包含以下内容时,也可能会出现错误:

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

根据文档,此选项“使您能够消除应用程序对全球化数据和全球化行为的依赖”。除了文件大小更小之外,我不知道其好处是什么,但SqlConnection不能与其一起使用。

可能是一个旧的回复,但这个线索帮助我修复了一个新的.NET 8应用程序的错误。从.csproj文件中删除<InvariantGlobalization>true</InvariantGlobalization>解决了这个问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接