混合ADO.NET和LINQ-TO-SQL是不是很糟糕?我的数据层不起作用

时间:2009-07-07 19:49:25

标签: sql linq-to-sql iis ado.net

更新

正如Mathias在下面所说,这个确切的问题已在此处报告并解决: ASP.NET-MVC (IIS6) Error on high traffic: Specified cast is not valid

原始帖子

这可能是一个太具体的调试问题要在这里发布,但无论如何我都会发布它,希望它能产生其他人认为有用的解决方案。

我有一个在中等负载下运行的Web应用程序 - 可能每秒5个请求。它有一些较旧的代码通过ADO.NET + DataReaders与Sql交谈,并且使用相同的技术至少五年没有问题。它还有一些使用LINQ-to-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. 我怀疑内存不好,但服务器使用的是已注册的ECC DIMM。

  8. 我还有其他使用ADO.NET的应用程序可以正常工作,从不会出现问题。

  9. 问题发生后,我可以通过Management Studio调用完全相同的存储过程,并返回正确的预期结果。

  10. 这是我的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的组合是否有可能使用来自连接池的相同连接,有一些奇怪的副作用?

    问题:我应该尝试任何调试步骤吗?任何可能有用的事件日志或性能指标?

2 个答案:

答案 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)或应用程序中心测试来重现开发中的错误。