sql server-LINQ To sql表示在读取器关闭时调用Read的尝试无效



我有一个服务器和一个客户端。服务器是承载WCF服务的web应用程序。服务器通过静态单例使用Linq2SQL DataContext,该单例在第一次访问时初始化,并且从未被释放(在我的代码中)。客户端通过WCF调用服务器,从数据库中查询一些信息,进行更新。在几个客户端同时访问服务器之前,一切都很正常。当这种情况发生时,服务器会抛出不同的异常:

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

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

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

为什么会发生这种情况?

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

不用担心管理连接,.Net会为您汇集/重用它们。

使用语句包装数据库上下文,一切就绪。

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

单例意味着每个应用程序/进程只有一个实例。asp.net应用程序使用相同的进程来服务所有请求,但每个请求都有自己的线程。因此,您在所有请求中共享相同的上下文实例。简单的答案是,不要对数据上下文使用singleton模式,这绝对是错误的做法。

最新更新