零星的 ASP.NET 数据错误:“找不到表 0”

dno*_*ord 3 sql-server asp.net dataset

在生产环境中部署了 ASP.NET 站点的新版本后,我每秒记录数十个数据错误,几乎总是出现错误“找不到表 0”。我们使用数据集并经常参考Table[0],虽然我了解在访问之前检查数据集的表的防御性编码实践Table[0],但在过去从来不是问题。某个页面会在一秒钟内正常加载,然后在下一秒钟会丢失其数据驱动组件之一。只是看看这是否为任何人敲响了警钟。

更多细节:这次我使用了不同的构建服务器,虽然我认为两者的编译器设置是相同的,但我很难想到有一个开关可以让我的 50% 的数据库调用在没有表的情况下返回。我也将项目切换到 VS 2008,但是当我切换回 VS 2005 时恢复了所有这些更改。我注意到构建的程序集有一个新的MyLibrary .XmlSerializers.dll,它不习惯,但我也无法想象这是造成所有麻烦的原因。(它也不会因调用MyLibrary而失败,或者至少不会超过任何其他时间。)

更新添加:我发现麻烦的构建是“发布”构建,其中工作构建被编译为“调试”。 这能解释吗?

在这些更改修复它之前回滚到构建。(重新启动 SQL Server,我们之前尝试过的步骤没有。)

问题似乎也是基于负载的——这在我们的集成和 QA 环境中毫无问题地巡航,甚至我们的冒烟测试环境——指向生产数据的环境——在轻负载下也很好。

这是否具有您过去可能见过的任何事物的显着特征?

Aru*_*nas 5

因为我们遇到了同样的问题,所以提出这个老问题,也许我们的解决方案可以让我们更深入地了解导致这种情况的原因。

本质上,此问题发生在 Windows 服务负载非常重的生产环境中,该服务使用多个线程同时处理多个作业(100 个用户通过 ASP.NET Web 应用程序使用相同的数据库,并且在较旧的服务器上每秒大约有 60 个事务) SQL Server 2000 硬件)。

没有共享变量,即重新打开连接,启动事务,执行操作,提交事务并关闭连接。

在重负载下,有时会发生以下异常之一:

NullReferenceException: Object reference not set to an instance of an
object.
at System.Data.SqlClient.SqlInternalConnectionTds.get_IsLockedForBulkCopy()
Run Code Online (Sandbox Code Playgroud)

或者

System.Data.SqlClient.SqlException:
The server failed to resume the transaction. Desc:3400000178  
Run Code Online (Sandbox Code Playgroud)

或者

New request is not allowed to start because it should come with valid  transaction descriptor  
Run Code Online (Sandbox Code Playgroud)

或者

This SqlTransaction has completed; it is no longer usable
Run Code Online (Sandbox Code Playgroud)

似乎池中的连接以某种方式损坏并与以前使用的事务保持关联。此外,如果从池中检索此类连接,则 sqlAdapter.Fill(dataset) 会导致数据集为空,从而导致“找不到表 0”。因为我们的服务会在失败时重试操作(读取作业列表),并且它总是会从池中获得相同的损坏连接,所以它会因此错误而失败,直到重新启动。

我们通过在异常情况下使用 SqlConnection.ClearPool(connection) 来确保此连接从池中被丢弃并重构应用程序以减少线程同时访问相同资源,从而消除了该问题。

我不知道究竟是谁导致了这个问题,所以我不确定我们是否真的解决了这个问题,也许只是让它变得如此罕见,它再也没有发生过。