0

我刚刚继承了一个 ASP.NET MVC4 应用程序,该应用程序的基类具有以下成员:

protected static DBMainDataContext m_dataContext = new DBMainDataContext();

此基类由其他两个类继承,这两个类都使用 LINQ 从数据库中读取数据。这个基类有一个静态数据上下文的事实,这会带来问题吗?我们似乎在 DataReader 无法访问的行中遇到错误,因为它已经打开。这可能是原因吗?如果是,应该如何声明?我只是删除 static 关键字吗?

谢谢!

4

2 回答 2

0

静态成员应该是线程安全的,这是一般规则。所以,你的静态m_dataContext应该是线程安全的。

DBMainDataContext不是线程安全的。因此,如果两个线程(两个 ASP.NET 请求)访问然后数据上下文,它是由两个线程同时修改。这将导致冲突。

所以你有两个选择:

  1. 删除static并且每个线程有一个数据上下文。
  2. 通过在所有使用它的调用周围放置一个锁来同步对数据上下文的访问。
于 2013-04-29T19:25:58.300 回答
0

是的,删除static关键字是要走的路。

如果这是一个 LINQ to SQL 或实体框架上下文,那么对象构造成本应该非常低,因此您应该为每个请求使用一个新实例。

您可能还应该验证您的 DataReaders 是否正确关闭(如 ryrich 建议的那样)。确保这一点的最佳方法是将它们的用法包装在 using-block 中:

using( var reader = ... )
{
    // code to use the reader here
}
于 2013-04-29T19:21:48.593 回答