【问题标题】:How to force NHibernate to recognize db changes not made through NHibernate如何强制 NHibernate 识别不是通过 NHibernate 进行的数据库更改
【发布时间】:2010-09-19 19:54:42
【问题描述】:

我正在将 NHibernate 实现到现有的 Web 应用程序中。但是,我们还有一些其他进程可以在数据库上进行批量插入和更新。如何让 NHibernate 知道后端数据库上发生的更改不是通过 NHibernate 启动的?

我读过的关于 NHibernate 在 asp.net 中使用的大部分信息都提到了将 Session 对象存储在 HttpContext 或 CallContext 中。然后,这将在应用程序生命周期期间存储会话对象。这就是我已经实现的。我害怕在每个请求上初始化 NHibernate 的成本。在每个请求上初始化 Session 对象时,这种方法不会对性能造成重大影响吗?

另外,将 SessionFactory 存储在 HttpContext 或 CallContext 中以便不必在每个请求上重新生成映射是否更有意义?

【问题讨论】:

  • 快速回答是新会话将看到新数据。你能准确地澄清你期望发生的事情吗?您是否希望保存的实体在保存之前知道它们下面的数据发生了变化?

标签: asp.net nhibernate caching


【解决方案1】:

你不应该。 NHibernate 会话可以帮助您在 ACID 环境中工作,这意味着一个事务不知道任何并发事务。您应该使用执行少量操作的短会话。您不应该长时间开放会话。如果您确实需要很长时间来处理域对象,那么您应该将域对象从不同的会话中分离出来,然后重新附加到不同的会话中。

一旦您打开一个新会话,在打开会话之前对数据库所做的任何更改都将通过 NHibernate 提供。

【讨论】:

    【解决方案2】:

    您不应将 Session 存储在多个请求中。糟糕,糟糕的主意。

    在每次调用时重新创建它几乎没有开销。它应该使用数据库连接池 - 这是大部分开销所在。

    【讨论】:

      【解决方案3】:

      默认情况下,NHibernate 不会在会话之间缓存任何内容。如果您的会话是短暂的(根据请求),您不必担心太多。

      如果您使用二级缓存或查询缓存,您可能需要手动刷新缓存。 SessionFactory.Evict 或 SessionFactory.EvictQueries 应该会有所帮助。重新启动应用程序也应该这样做,但这可能不是您要寻找的答案。

      在 ASP.NET 应用程序中,我看到的一般用法是为应用程序创建一个 SessionFactory,并为每个请求创建一个新的 Session。

      SessionFactory 需要一段时间来初始化,是线程安全的,只需要初始化一次。

      会话不是线程安全的,创建起来非常快。

      存储在 HttpContext 中的任何内容都只会在请求期间保持活动状态。在上下文中存储会话是正常的,应该会给你想要的结果。 SessionFactory 通常存储在一个静态变量中,并且与应用程序一样长。

      有关示例,请参阅 the NHIbernateHelper class here

      【讨论】:

      • 我知道这是一个老生常谈的问题,但可能值得注意的是,如果您使用进程外二级缓存,重新启动应用程序不会清除它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多