LINQ To SQL表示在读取器关闭时无效尝试调用Read

时间:2011-06-27 16:12:59

标签: sql-server wcf sql-server-2008 linq-to-sql client-server

我有一台服务器和一台客户端。 Server是托管WCF服务的Web应用程序。服务器通过静态单例使用Linq2SQL DataContext,它在第一次访问时被初始化,并且从未被处理过(在我的代码中)。客户端通过WCF调用服务器,从数据库查询一些信息,进行更新。一切正常,直到几个客户端同时访问服务器。当发生这种情况时,服务器会抛出不同的异常:

  

读取器关闭时无效尝试调用Read。

     

已经有一个与此命令关联的打开DataReader,必须先关闭它。

据我所知,问题在于我使用静态单例,并且它以某种方式在客户端连接之间共享,但我的主要目标是最小化与数据库的连接数量。

为什么会这样?

3 个答案:

答案 0 :(得分:3)

Linq to SQL DataContext不是线程安全的(请参阅MSDN)。通常,应该为不同的工作单元实例化DataContext;您可以更改代码以针对每个Web请求实例化一个,并确保在请求结束时关闭它,您可能会没事。

答案 1 :(得分:1)

单例表示每个应用程序/进程只有一个实例。 asp.net应用程序使用相同的进程来处理所有请求,但每个请求都有自己的线程。因此,您在所有请求中共享相同的上下文实例。简单的回答,不要对数据上下文使用单例模式,这绝对是错误的事情。

答案 2 :(得分:1)

不要担心管理连接,。Net将为您集中/重用它们。

将你的db上下文包装在using语句中并且你已经完成了设置。

除非你有一些极端的量和查询,否则你应该考虑优化它。