更新
正如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”或“读取器关闭时无效尝试调用读取”。
有趣的是,我从来没有从SqlCommand.ExecuteReader()或DataReader.Read()获得异常 - 例外情况只发生在我尝试解析返回的IDataRecord时。
我可以通过重新启动Sql或IIS来暂时解决问题。几个小时后它又回来了。
我已经尝试监控连接池中的连接数,但它永远不会超过3左右。当然永远不会超过100。
我在事件日志中没有收到任何指示Sql或IIS出现问题的内容。
驱动器有9 GB空闲空间。
我怀疑内存不好,但服务器使用的是已注册的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的组合是否有可能使用来自连接池的相同连接,有一些奇怪的副作用?
问题:我应该尝试任何调试步骤吗?任何可能有用的事件日志或性能指标?
答案 0 :(得分:2)
20次打开连接,5次点击/秒对我来说是一个红旗。我们接近100次点击/秒,并在10个连接处徘徊。
内存使用情况如何?它高吗?
我怀疑你在释放资源方面遇到了问题。我仍然在使用LINQ to SQL,而且我对ADO.NET也有很长的积极作用。我想知道你是否错过了使用LINQ to SQL清理连接的模式等等。
试试这个 - 你能在应用程序中将ADO.NET代码与LINQ隔离吗?如果你只进行ADO.NET调用,内存,连接数等会发生什么?然后添加LINQ的东西,看看它是如何影响它的。
资源问题似乎“起步较晚”,因为它们需要一段时间才能积累。
答案 1 :(得分:1)
<强>更新强>
我发现有人显然有同样的问题
ASP.NET-MVC (IIS6) Error on high traffic: Specified cast is not valid
ATLE
的回答很简单原始帖子
我在加载时看到linq-to-sql应用程序中的问题。我使用了MVC - Storefront Rob Connery所以我想很多人都会使用这种应用程序布局。 该应用程序在负载很小的情况下工作得很好,但是在中等负载下听起来就像你描述的那样奇怪的错误。
我怀疑这是存储db-context的问题。
在我的情况下,它很容易重现:我使用了jmeter并且有5个线程,每个线程每秒有几个请求(我猜是20个)。我真的需要来自多个线程的负载。
所以我的建议是:尝试通过使用Jmeter创建一些负载(不适用于ASP.NET但适用于ASP.NET MVC)或应用程序中心测试来重现开发中的错误。