【问题标题】:Is using a singleton class for db context creation a good practice? [closed]使用单例类创建数据库上下文是一种好习惯吗? [关闭]
【发布时间】:2014-02-24 07:43:17
【问题描述】:

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

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

【问题讨论】:

  • @jamesakadamingo - 兄弟你花时间纠正我的语法错误,我真的很感动,如果你回答了我的问题,我认为它会更有帮助。但是谢谢你指出这个错误,以后会记住的。
  • 这个问题一开始就不应该被否决。
  • @user1006544 不是故意编辑语法的行为!只是想在我没有时间做的时候帮助用户的问题得到解答!
  • Who needs singletons?的可能重复

标签: sql-server asp.net-mvc entity-framework c#-4.0


【解决方案1】:

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

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • 这确实回答了这个问题,但我会让它更清楚
  • 所以使用单例对象不好,而是每次为db交互创建新的上下文,对吗?
  • 不一定针对每个数据库交互,而是针对数据库交互的公共线程(在 ASP.NET MVC 的情况下,每个请求往往是一个上下文)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    使用单例 DbContex 真的很糟糕。所有更改都将在每个 SaveChanges 中检查。当您的 DbContext 寿命足够长时,它会非常缓慢。

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多