使用单例类创建数据库上下文是否是一种好的做法



我想创建一个用于数据库上下文创建的单例对象。我只是好奇在 mvc 应用程序中使用单例上下文是否是一种好的做法。

有人可以描述单例上下文对象的优缺点吗?

DbContext不是线程安全的,这对于它在多线程使用环境(如 ASP.NET MVC)中用作单例对象来说是一个巨大的缺点。 多个并发数据库操作将导致引发异常,您需要同步对单一实例对象的访问以避免这种情况。 您还需要担心过时的缓存数据在其生命周期内,并适当地管理刷新所述数据。

作为澄清点,请考虑您的单一实例是否需要按会话请求或应用程序域。如果将范围限制为单个会话请求,则可以使用单个访问点(工厂)来创建变量,并在该会话中保持该值处于活动状态,但请确保在请求完成时释放它。

但是,不要为整个应用域(静态变量)甚至用户会话保持活动的单个上下文值。上下文会记住它获取的每个对象(以支持跟踪更新的字段/值)。最终,您最终会在内存中复制数据库,但只能使用该服务器实例中的值。如果您有服务器场,则随着时间的推移,服务器之间的过时数据会使情况更加复杂。

使用单例 DbContex 真的很糟糕。所有更改都将在每次保存更改中签入。当你的 DbContext 存在足够长的时间时,它会非常慢。

最新更新