更新
正如 Mathias 在下面指出的那样,这个确切的问题已在此处报告并得到解决: ASP.NET-MVC (IIS6) Error on high traffic: Specified cast is not valid
原帖
这可能是一个过于具体的调试问题,无法在此处发布,但我还是将其发布,希望它能产生其他人认为有用的解决方案。
我有一个在中等负载下运行的 Web 应用程序——每秒可能有 5 个请求。它有一些较旧的代码通过 ADO.NET + DataReaders 与 Sql 对话,并且已经使用相同的技术至少五年没有问题。它还具有一些使用 LINQ-to-SQL 的较新代码。这两种技术都使用相同的连接字符串来最大化连接池的重用。
最近我遇到了这些症状所描述的非常奇怪的行为:
一切都会完美运行大约一天,然后突然对数据层(ADO.NET 和 LINQ)的每次调用(或几乎每次调用)都会返回我的代码无法解析的数据 -- 我您会得到类似“无法将‘System.Int32’类型的对象转换为‘System.String’类型的对象”这样的异常。或“序列不包含任何元素”或“IndexOutOfRangeException”或“阅读器关闭时调用 Read 的尝试无效”。
有趣的是,我从未从 SqlCommand.ExecuteReader() 或 DataReader.Read() 中得到异常——只有当我尝试解析返回的 IDataRecord 时才会出现异常。
我可以通过重新启动 Sql 或 IIS 来临时解决问题。几个小时后它又回来了。
我已经尝试监控连接池中的连接数,但它从未超过 3 个左右。绝对不会超过 100。
我在事件日志中没有收到任何表明 Sql 或 IIS 有任何问题的信息。
驱动器有 9 GB 的空闲空间。
我怀疑 RAM 有问题,但服务器使用的是已注册的 ECC DIMM。
我还有其他使用 ADO.NET 的应用程序,它们运行良好并且从未出现问题。
出现问题时,我可以通过 Management Studio 调用完全相同的存储过程,它们会返回正确的预期结果。
这是我的 ADO.NET 访问模式:
using (var dbConn = Database.Connection) // gets already-open connection
{
var cmd = new SqlCommand("GetData", dbConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", id);
SomeDataObject dataObject = null;
var dr = cmd.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SingleRow);
if (dr.Read())
dataObject = new SomeDataObject(dr);
dr.Close();
return dataObject;
}
理论:代码的一部分中的 ADO.NET 和代码的另一部分中的 LINQ 的组合,两者都使用来自连接池的相同连接,是否有可能产生一些奇怪的副作用?
问题:是否有任何我应该尝试的调试步骤?任何可能有帮助的事件日志或性能指标?
最佳答案
每秒 5 次点击时超过 20 个打开的连接对我来说是一个危险信号。我们有接近 100 次点击/秒并徘徊在 10 个连接左右。
内存使用情况如何?高吗?
我怀疑您在释放资源方面遇到了问题。我仍然对 LINQ to SQL 很感兴趣,而且我对 ADO.NET 也有长期积极的经验。我想知道您是否缺少 LINQ to SQL 清理连接等的模式。
试一试 - 您能否在应用程序中将 ADO.NET 代码与 LINQ 隔离开来?如果您只进行 ADO.NET 调用,内存、连接计数等会发生什么情况?然后添加 LINQ 内容,看看它是如何影响它的。
资源问题似乎“起步较晚”,因为它们需要一段时间才能积累。
关于sql - 混合使用 ADO.NET 和 LINQ-TO-SQL 不好吗?我的数据层不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1094443/