6

在 qa 中使用后,我们收到以下错误

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

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

SOF 建议:

EF 从服务器宕机导致的无效操作异常中恢复

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

2)配置池连接数更高

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

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

4

2 回答 2

11

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

你有任何证据吗?我相信实体框架和实际上大多数数据访问框架都是为许多短期和独立的上下文而设计的。在这里实现自己的池/缓存通常是一种反模式,可能会导致过时的结果、并发问题和不良的故障恢复(就像这里的情况一样)。

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

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

于 2013-01-16T13:16:43.317 回答
2

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

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

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

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

不要创建长期存在的上下文实例。

于 2013-01-16T13:37:36.490 回答