我采用单列模式返回数据操作层。所以在只new 一个 DataContext时。经常会出现
已经打开一个DataReader。必须先关闭之类的错误!(我个人的理解是:就是因为才一个DataContext,所以有时候当同时进行2个查询的话会出现这个错误。不知道是否理解的有错!)所以我才在每个查询方法中都使用new DataContext,但是性能变的超差!
应该怎么样解决?
ps:系统原来的数据层是用sql语句写的!我把他改成了linq。使用sql的话。在每个查询方法中都有打开一个新链接然后关闭!不会出现错误问题!但是使用linq的话如果不在每个方法中间new DataContext就经常出错!
我猜你做的是个WEB项目。你用单例来返回DataContext肯定会出问题的。可以用伪单例,就是在每个Request的生命周期里存在一个唯一的DataContext,把这个DataContext放在当前HttpContext.Items[]里面。可以用工厂方法来实现。
虽然可以用上面的方法,但是每次new DataContext()应该也是可以的。DataContext是轻量级的对象,微软设计的就是可以使用之前new, 用完就Dispose的,不应该造成性能问题。建议你再仔细看一下报的异常,找出问题的根源。
给你的建议:
1、显式打开连接,减少反复打开连接的次数。(不过SQL Server具有连接池,不一定很有效)
dataContext.Connection.Open()
2、使用单例缓存一部份常用的数据。
Linq的话不是可以直接对象话查询么?
DataContext有个Current的对象,直接关联数据库对应的表,然后可以进行对象话查询,可以不用到DataReader吧。
Linq to sql 的效率蛮低的,不建议使用