我的 .NET MVC 项目已经到了对多个用户进行测试的阶段,我收到了与 Linq2Sql DataReader 问题相关的看似随机的错误(来自站点中的任何屏幕),例如:
“阅读器关闭时调用 FieldCount 的尝试无效。” 和
'ExecuteReader 需要一个开放且可用的连接。连接的当前状态是关闭的。
如果双击链接或浏览器中的多个选项卡或同时刷新不同浏览器时,这些错误在单用户测试期间出现的频率也较低。
我想知道这些问题是否归结为 DataContext 线程问题。
目前,我正在使用存储库方法,每个业务流程都有单独的存储库。每个存储库类在其构造函数中启动一个 DataContext 实例,存储库中的大多数方法都使用该实例。
然而,一些方法正在更新 DataLoadOptions 以强制预先加载视图数据,因此这些方法创建了它们自己的 DataContext 实例。
此外,在某些屏幕上,还会显示来自多个业务对象的信息,因此单个请求中可能涉及 2 或 3 个存储库。因此,每个请求可能会创建许多单独的 DataContext 实例。
我尝试在必要时使用 DataLoadOptions 并在查询结果上应用 ToList() 来强制执行急切加载方法,以确保预先加载所有内容(而不是等到视图呈现) - 所以每个 DataContext 应该只打开一个相当短的时间。
由于错误似乎与重用相同 DataContext(s) 的多个线程有关,我正在考虑按照 Rick Strahl 的线程特定 DataContextFactory ( http://www.west-wind.com ) 为每个请求实现单个 DataContext /weblog/posts/246222.aspx)或更简单的“工作数据存储单元”方法,如史蒂夫桑德森的示例(http://blog.stevensanderson.com/2007/11/29/linq-to-sql-the-multi -层故事/)。
但是接下来需要解决 DataLoadOptions 的问题。我可以创建其他特定于线程的 DataContext,但这似乎偏离了我对每个请求使用单个 DataContext 的目标。因此,我正在考虑重用相同的 DataContext 但暂时更改某些方法的 LoadOptions ,如 Kevin Watkin 的示例(http://www.mrkwatkins.co.uk/Blog/2010/05/)
或废弃标准 DataLoadOptions 方法Roger Jennings 在 Visual Studio 杂志 ( http://visualstudiomagazine.com/Articles/2007/11/01/Optimize-LINQ-to-SQL-Performance.aspx?页=3 )
所以我的问题是有没有人遇到过类似的随机 DataReader 问题,你是如何解决它们的,我是否有可能通过实施我链接到的那些解决方案来解决问题?
与往常一样,时间很紧——所以如果问题实际上出在其他地方,我不想花时间实施解决方案。任何帮助将不胜感激!
PS。恐怕这是一个相当高级的问题,我没有包含任何具体的代码示例,因为我不确定问题到底出在哪里。