随机DataReader错误和特定于线程的DataContext允许更改DataLoadOptions

时间:2010-07-16 11:13:23

标签: asp.net-mvc linq-to-sql datacontext datareader loadoptions

我的.NET MVC项目已经到了多个用户的测试阶段,我看到与Linq2Sql DataReader问题相关的看似随机错误(来自站点中的任何屏幕),例如:
“关闭阅读器时,无法尝试调用FieldCount。”和
'ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭 如果双击链接或浏览器中的多个选项卡或同时刷新不同的浏览器,这些错误在单用户测试期间也会显得不那么频繁。

我想知道这些问题是否归咎于DataContext线程问题。

目前,我正在为每个业务流程使用存储库方法和单独的存储库。每个存储库类在其构造函数中触发一个DataContext实例,这由存储库中的大多数方法使用 但是有些方法正在更新DataLoadOptions以强制急切加载视图数据,因此这些方法会创建自己的DataContext实例。
此外,在某些屏幕上显示来自多个业务对象的信息,因此单个请求中可能涉及2个或3个存储库。因此,每个请求可能会创建许多单独的DataContext实例 我试图在必要时使用DataLoadOptions强制执行一个急切的加载方法,并在查询结果上应用ToList()以确保所有内容都预先加载(不等到呈现视图) - 所以每个DataContext只应该打开一个相当短的时间。

由于错误似乎与重用相同DataContext的多个线程相关,我正在考虑按照Rick Strahl的Thread Specific DataContextFactory(http://www.west-wind.com/weblog/posts/246222.aspx)或者a的方式按请求实现单个DataContext。更简单的“工作单元数据存储”方法,如Steve Sanderson的例子(http://blog.stevensanderson.com/2007/11/29/linq-to-sql-the-multi-tier-story/)。

但是要解决DataLoadOptions的问题。我可以创建其他特定于线程的DataContexts,但这似乎远离了我的每个请求使用单个DataContext的目标。因此,我正在考虑重复使用相同的DataContext,但暂时更改某些方法的LoadOptions,如Kevin Watkin的示例(http://www.mrkwatkins.co.uk/Blog/2010/05/)中所示 或者废弃标准的DataLoadOptions方法,转而使用preload存储过程预先填充EntityRefs,如Roger Jennings在Visual Studio杂志中所讨论的那样(http://visualstudiomagazine.com/Articles/2007/11/01/Optimize-LINQ-to-SQL-Performance.aspx?Page=3

所以我的问题是,是否有任何人遇到类似的随机DataReader问题,你是如何解决这些问题的,我是否可能通过实施我已链接到的解决方案来解决问题?

一如既往时间紧迫 - 所以如果问题确实存在于其他地方,我不想花费它来实施解决方案。任何帮助将不胜感激!

PS。我担心这是一个非常高级的问题,我没有包含任何具体的代码示例,因为我不确定问题的实际位置。

0 个答案:

没有答案