执行该命令需要一个开放且可用的连接。 连接的当前状态被破坏。

在qa中使用一些后,我们得到以下错误

Execution of the command requires an open and available connection. The connection's current state is broken.

我们正在使用EntityFramework的单例实例

SOF建议:

服务器关闭导致无效操作exception的EF恢复

1)偶尔创建一个新的ContectObject实例

2)配置池连接数更高

解决这个问题的最佳做法是什么?

我认为为每个Dal操作创建一个新的contectObject是浪费的

我认为为每个Dal操作创建一个新的contectObject是浪费的

你有这方面的证据吗? 我相信entity framework和大多数数据访问框架都是针对许多短期和独立的上下文而设计的。 在这里实现自己的池/缓存通常是一种反模式,可能导致过时的结果,并发问题和糟糕的故障恢复(这里就是这种情况)。

您认为哪些具体资源会被浪费,您是否通过实验validation了这一点?

基本上,我建议为每个工作单元创建一个新的上下文(可能大致对应于一个请求) – 测量任何性能差异,并查看问题是否消失(正如我预期的那样)。 作为测试的一部分,偶尔会断开数据库服务器与网络的连接以检查您是否可以实际恢复…

请阅读有关连接池的信息 。

当您处置EF上下文时,您将处置基础存储提供程序连接。 但是,当您处置存储连接时,默认情况下您不会关闭任何传输级别连接,除非您没有明确关闭连接池。

此外,EF缓存每个应用程序域的元数据视图。
因此,EF上下文创建实际上很便宜

另外,请记住,每个上下文实例中都有更改跟踪器。 当您拥有单个上下文时,其更改跟踪器会跟踪已实现或附加到上下文的所有内容。 “跟踪所有内容”意味着,您通过上下文检索的每个实体实例都不会被处理 – 跟踪器会保留对它的引用。

不要制作长寿的上下文实例。