NHibernate - 随机出现的“无法找到持久性”

时间:2012-04-11 02:20:25

标签: asp.net-mvc-3 nhibernate iis-6

我看过很多帖子Re:上面的问题(无法找到persister)。但是我们遇到的问题是这个错误在我们的Web应用程序(ASP.Net MVC)中随机出现。此外,当我们重新启动应用程序池时,问题就会消失。

大多数情况下,缓存的实体会发生错误。请参阅下面的映射。

  <class name="Privilege" table="PRIVILEGE" lazy="false">
<cache usage="nonstrict-read-write"/>
<id name="Id" />
<property name="Description" column="DESCRIPTION" not-null="true" />
<set name="RoleCollection" table="PRIVILEGE_ROLE">
  <cache usage="nonstrict-read-write"/>
  <key column="PRIVILEGE_ID" foreign-key="PRIVILEGE_ROLE_FK1" />
  <many-to-many class="Role" column="ROLE_ID" foreign-key="PRIVILEGE_ROLE_FK2" />
</set>

<class name="Role" table="ROLE" lazy="false" >
<cache usage="nonstrict-read-write"/>
<id name="Id"  />
<property name="Description" column="DESCRIPTION" not-null="true" />
<set name="PrincipalCollection" table="ROLE_PRINCIPAL">
  <cache usage="nonstrict-read-write"/>
  <key column="ROLE_ID" foreign-key="ROLE_PRINCIPAL_FK1" />
  <many-to-many class="Principal" column="PRINCIPAL_ID" foreign-key="ROLE_PRINCIPAL_FK2" />
</set>

这可能与NHb会话损坏有关吗?如果有人能够至少指出我们对此进行故障排除的方向,我们非常感谢,因为它无法始终如一地重现问题。 (我们使用NHb 3.1.0.4000)

1 个答案:

答案 0 :(得分:1)

很抱歉提供更新时间很晚。

我已经找到了原因,它恰好是Nhibernate Session Factory的初始化方式。

  1. Nhb Session Factory很懒散。即在第一个需要数据库会话的HTTP请求时。 (即仅在积极要求时才创建)
  2. 一旦创建,它就会重新使用,因为它是一个单身人士
  3. 我们已经将应用程序池配置为每天(凌晨4点)进行回收,我们注意到异常的第一次出现也大致在同一时间段。
  4. 当用户(HTTP)请求属于应用程序池回收窗口时,该问题看起来像是IIS多线程和NHb会话工厂实现的组合。
  5. 解决方案

    1. 回到急切的初始化。即NHb会话工厂的初始化现在发生在Application_Start。
    2. 因此,HTTP用户请求“始终”具有要使用的现成会话因子。
    3. 这种方法不仅解决了这个问题,从性能的角度来看,我认为这是一个更好的选择。急切地进行会话工厂初始化的昂贵操作而不是对特定用户请求施加更多权重更能反映出手头的问题。

      我们正在prod运行这个修改版本一个月,没有任何问题。