sql - 混合使用 ADO.NET 和 LINQ-TO-SQL 不好吗?我的数据层不工作

标签 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”或“阅读器关闭时调用 Read 的尝试无效”。

  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 的组合,两者都使用来自连接池的相同连接,是否有可能产生一些奇怪的副作用?

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

最佳答案

每秒 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/

相关文章:

sql - 如何使用 JOIN 将列从一个表复制到另一个表

c# - 使用 LINQ 使用复合主键更新表

asp.net - 将 ASP NET Core 部署到 IIS

.net - 从 iPhone 上传图像/音频到服务器无法发送大图像

.net - System.DirectoryServices.DirectoryServicesCOMException : An operations error occurred

c# - 两个带有链接字段的插入查询

php - MySQL查询搜索多个属性和value_id

c# - 如何使用 LINQ to SQL 连接到 SQL Server?

c# - Linq to sql - 左外连接

mysql - SQL - 提取可变长度字符串的数字部分