在混合ADO.NET和LINQ到SQL不好? 我的数据层不工作(Is mixing ADO.NE

2019-09-17 22:04发布

UPDATE

由于马蒂亚斯下面指出,这种确切的问题已经被报告并解决在这里: ASP.NET MVC的高流量(IIS6)错误:指定的转换无效

原帖

这可能是太特殊,无法在这里发表调试的问题,但我的,因为它会产生一个解决方案,其他人找到有用的希望无论如何张贴。

我有中度负载下运行的Web应用程序 - 每秒也许5个请求。 它有一些旧的代码通过ADO.NET +的DataReader交谈,SQL和一直使用同样的技术在至少五年没有问题。 它还具有使用LINQ到SQL一些较新的代码。 这两种技术都使用相同的连接字符串,以最大限度地提高连接池重用。

最近我遇到这些症状描述的非常怪异的行为:

  1. 一切都会很好地工作一天左右,然后突然每次调用(或几乎所有的调用)数据层(包括ADO.NET和LINQ)返回不能由我的代码解析的数据 - 我会得到“无法例外投型“System.Int32”的对象为类型“System.String”“。 或“序列不包含任何元素”或“IndexOutOfRangeException”或“无效试图调用读时读取器已关闭”。

  2. 有趣的是,我从来没有从SqlCommand.ExecuteReader()或DataReader.Read异常() - 例外,当我尝试解析返回的IDataRecord才会发生。

  3. 我能够重新启动SQL或IIS暂时解决问题。 几个小时后,它再回来。

  4. 我试过监控连接池中的连接数,它永远不会大于3左右。 当然,从来没有超过100。

  5. 我没有收到在事件日志中,表示与SQL或IIS的任何问题,任何东西。

  6. 该驱动器有9 GB空闲空间。

  7. 我怀疑坏的RAM,但服务器使用注册的ECC的DIMM。

  8. 我有使用ADO.NET是做工精细,从来没有出现此问题的其他应用程序。

  9. 当问题发生,我可以通过打电话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的一部分代码的另一部分的组合,无论是使用连接池相同的连接,是有一些奇怪的副作用?

问:是否有我应该尝试任何调试步骤? 任何事件日志或性能指标,可以帮助?

Answer 1:

UPDATE

我发现SO人谁显然有同样的问题

ASP.NET MVC的高流量(IIS6)错误:指定的转换是无效的 。

它是在从ATLE答案expained

原帖

我已经在负载下看到的LINQ到SQL应用程序的问题。 我用MVC - 店面罗布·康纳利,所以我想有很多人使用这种应用程序布局。 该应用程序完美的工作时,小负荷下,但在那里,听起来像一个奇怪的错误,你中负载时形容。

我怀疑这是与被存储在DB-背景下,其中的一个问题。

在我的情况很容易重现:我用JMeter的,并有各自具有对夫妇每秒请求数(20我猜的)5个线程。 我真的需要有多个线程负载起始。

所以我的建议是:通过创建使用JMeter一些负载(不适合ASP.NET但对于ASP.NET MVC)或应用程序中心测试重现发展的错误。



Answer 2:

20 + 5次命中打开连接/秒是红旗给我。 我们有接近100次点击/秒,并徘徊在10个连接。

关于内存使用什么样的? 它是高?

我怀疑你遇到与释放资源的问题。 我还是让我的脚湿与LINQ to SQL和我也有使用ADO.NET长期积极豁达。 我不知道如果你错过了与LINQ来清理连接的模式,以SQL等。

试试这个 - 你可以从LINQ应用程序隔离ADO.NET代码? 如果你只让ADO.NET电话,会发生什么内存,连接数等? 然后添加在LINQ的东西,看看它是如何影响它。

资源问题似乎“后期启动”监守他们需要一段时间来积累。



文章来源: Is mixing ADO.NET and LINQ-TO-SQL bad? My data layer isn't working