当前位置: 首页 > 面试题库 >

混合使用ADO.NET和LINQ-TO-SQL是否不好?我的数据层无法正常工作

有凯泽
2023-03-14
问题内容

原始帖子

这可能是一个过于具体的调试问题,无法在此处发布,但无论如何我还是在发布它,希望它能提供其他人认为有用的解决方案。

我有一个在中等负载下运行的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的组合是否都使用来自连接池的相同连接,是否会产生一些怪异的副作用?

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


问题答案:

原始帖子

在负载下,我已经在linq-to-sql应用程序中看到了问题。我使用了Rob Connery的MVC-
Storefront,所以我想很多人都在使用这种应用程序布局。该应用程序在负载很小的情况下运行良好,但是在中等负载下,那里出现的奇怪错误听起来像您所描述的那样。

我怀疑这是数据库上下文存储位置的问题。

就我而言,很容易重现:我使用jmeter并有5个线程,每个线程每秒有几个请求(我猜是20个)。我确实需要具有源自多个线程的负载。

因此,我的建议是:尝试通过使用Jmeter创建负载(对ASP.NET不利,但对ASP.NET MVC不利)或应用程序中心测试来重现开发中的错误。



 类似资料:
  • 问题内容: 有没有可以将SQL语法转换为LINQ语法的工具? 我只想用join等将基本查询重写为LINQ。这样可以节省很多时间。 问题答案: 编辑7/17/2020:我无法删除这个已接受的答案。它曾经是很好的,但现在不是。伙计们,要当心真正的老帖子。我正在删除链接。 [ Linqer ]是将SQL转换为LINQ的工具。它可以帮助您学习LINQ并转换现有的SQL语句。 并非每个SQL语句都可以转换为

  • 问题内容: 作为一个非C#精通的程序员,我对LINQ查询的评估语义感到好奇,如下所示: 假设这是一个定义了and字段的ADO实体,那么从数据库的角度来看,这将做什么?具体来说,是否将运行查询以生成内存中的结构,然后由查询查询该结构?还是仅从中提取有关查询的数据,然后产生一个新的数据库对等查询的结构?因此,如果我遍历这两个查询,将执行多少个SQL语句? 问题答案: 它们是可组合的。这是可能的,因为L

  • 问题内容: 根据我所看到的LINQ的许多示例,我正在使用类似于以下代码的代码创建自己的数据上下文和表: 但是对于每个表(小部件,汽车等),我都会得到警告 字段’TableName’从未分配 。我在Google上找不到任何也存在此问题的人。我不觉得我做错了什么,因为我只是复制从不同地方看到的LINQ示例。那么这个警告是怎么回事呢?它警告我一个真正的问题吗?还是我错过了什么? 问题答案: 是的,他们是

  • 问题内容: 我正在尝试转换此查询(已经可以使用) 对于Linq to SQL,但我不知道自己在做什么错。看我的尝试 我只需要对建筑物进行分组并计算每个建筑物有多少用户。 问题答案: 只需使用以下方法:

  • 问题内容: 我有一个SQL语句,我正在尝试将其转换为LINQ to SQL,并且已经设法将其中的大多数转换了,但是遇到了一个语句,我无法在LINQ中全神贯注。 引起头痛的SQL查询部分是: 是包含一系列操作的表,是可用操作的列表。是状态列表的索引-4 ==’失败’。 基本上,对于 未 失败的动作,它需要返回 下一个 动作。如果行动 已经 失败,它返回 当前 的行动。 这只是联接之一(完整查询中总共

  • 问题内容: 在使用Linq to SQL时,对多对多关系表使用多列(复合)主键是否有益? 还是应该仅将身份列添加为非群集主键并适当地索引FK列? 问题答案: 不是LINQ问题。如果您的架构需要它们,请使用它们。如果您不这样做,请不要。无论哪种方式,LINQ都能很好地处理您的架构。 LINQ to SQL不能很好处理的一个领域是用于连接多对多关系的多列/键映射表,但是我不会说这严格属于您的问题解决的