2013-04-29 59 views
0

我只是继承了具有以下成员基类的ASP.NET应用程序MVC4:保护基类的静态

protected static DBMainDataContext m_dataContext = new DBMainDataContext(); 

这个基类是其他两个类,无论使用LINQ来读取数据继承来自数据库。这个基类有一个静态数据上下文的事实,这是否构成一个问题?由于DataReader已打开,因此我们似乎正在获取DataReader无法访问的错误。这可能是为什么?如果是的话,应该如何申报?我只是删除静态关键字?

谢谢!

+0

作为一般规则,重用'DBContext'或'ObjectContext'的实例似乎是一个坏主意。我认为最好的方法是创建一个'Func ',它在每次需要时返回一个新的实例。 – 2013-04-29 19:19:50

+0

@HighCore技术上不需要改变static关键字,因为包含它的控制器由MVC为每个请求实例化。 – 2013-04-29 19:23:12

+0

当您完成从数据库中读取数据时,是否正确关闭了数据读取器? – ryrich 2013-04-29 19:23:35

回答

0

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

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

您应该也许应该验证您的DataReader是否正确关闭(如ryrich建议)。确保这一点的最好办法是来包装他们的使用在使用块:

using(var reader = ...) 
{ 
    // code to use the reader here 
} 
+0

这是一个LINQ to SQL上下文,正如我所提到的,在代码中没有对DataReader的显式操作,所以我认为LINQ在幕后使用了一个。我会尝试删除静态关键字,看看我们是否还有这些错误。 – Ray 2013-04-29 19:44:02

0

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

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

所以,你有两个选择:

  1. 取出static,并且每个线程一个数据上下文。
  2. 通过将使用它的所有调用置于锁定周围来同步对数据上下文的访问。
+1

并且请注意,考虑到这是一个网络应用程序,选项2对于这个问题是一个相当没有意思的解决方案。 – 2013-04-29 19:27:58