在qa中使用一段时间后,我们得到以下错误
Execution of the command requires an open and available connection. The connection's current state is broken.
我们正在使用EntityFramework的单例实例
SOF建议:
EF recovery from invalidoperationexception caused by server being down
1)偶尔创建一个ContectObject的新实例
2)将池连接数配置为更高
解决此问题的最佳做法是什么?
我认为为每个Dal操作创建一个新的contectObject是浪费的
答案 0 :(得分:11)
我认为为每个Dal操作创建一个新的contectObject是浪费的
你有这方面的证据吗?我相信实体框架和大多数数据访问框架都是设计的,适用于许多短期和独立的上下文。在这里实现自己的池/缓存通常是一种反模式,可能导致过时的结果,并发问题和糟糕的故障恢复(如此处的情况)。
您认为会浪费哪些特定的资源,并且您是否通过实验验证了这些资源?
基本上,我建议为每个工作单元创建一个新的上下文(可能大致对应于一个请求) - 测量任何性能差异,并查看问题是否消失(正如我预期的那样)。作为测试的一部分,偶尔会断开数据库服务器与网络的连接以检查您是否可以实际恢复......
答案 1 :(得分:2)
当您处置EF上下文时,您将处置基础商店提供商连接。但是,当您处置商店连接时,默认情况下,您不关闭任何传输级别连接,除非您未明确关闭连接池。
此外,EF会缓存每个应用程序域的元数据视图 因此,EF上下文创建很便宜,真的。
另外,请记住,每个上下文实例中都有更改跟踪器。当您拥有单个上下文时,其更改跟踪器会跟踪已实现或附加到上下文的所有内容。 “跟踪所有内容”意味着,您通过上下文检索的每个实体实例都不会被处理 - 跟踪器会保留对它的引用。
不要制作长寿的上下文实例。