2012-04-11 42 views
1

我見過很多帖子Re:上面的問題(無法找到persister)。然而,我們遇到的問題是,這個錯誤在我們的Web應用程序(ASP.Net MVC)中隨機出現。此外,當我們重新啓動應用程序池時,問題就消失了。NHibernate - 隨機出現的「無法找到persister」

大多數情況下,發生錯誤的是一個被高速緩存的實體。請參閱下面的映射。

<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 3.1.0.4000)

+0

這也發生在我身上。你有沒有發現它? – 2012-06-27 14:51:12

回答

1

抱歉遲到提供更新。

我已經找到了原因,它恰好是Nhibernate會話工廠正在初始化的方式。

  1. Nhb會話工廠是懶惰啓動。即在第一個需要數據庫會話的HTTP請求時。 (即只有當它正在積極要求創建)
  2. 一旦創建它的重複使用,因爲它是一個單身
  3. 我們已經配置應用程序池回收的每一天(4點),我們注意到,除了第一次出現也大致在同一時間段內下降。
  4. 當用戶(HTTP)請求位於應用程序池回收窗口內時,該問題看起來像是IIS多線程和NHb會話工廠實現的組合。

解決方案

  1. 回到渴望初始化。即NHb會話工廠的初始化現在發生在Application_Start。
  2. 因此,一個HTTP用戶請求'始終'有一個可用的會話因子來使用。

這種方法不僅解決了這個問題,我認爲從性能角度來看這是一個更好的選擇。急於進行會話工廠初始化的高成本操作而不是對特定用戶請求進行更多的重視,這更能反映當前的問題。

我們正在prod中運行這個修改版本一個月,現在沒有任何問題。

相關問題