1

私は多くの投稿を見てきました Re: 上記の問題 (永続化を見つけることができません)。ただし、問題は、このエラーが 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 を使用)

4

1 に答える 1

1

更新を提供するのが遅くなって申し訳ありません。

この理由を突き止めたところ、たまたま Nhibernate セッション ファクトリが初期化されていたことが原因でした。

  1. Nhb セッション ファクトリは遅延して開始されました。つまり、DB セッションを必要とする最初の HTTP リクエストで。(つまり、アクティブに要求されている場合にのみ作成します)
  2. シングルトンであるため、一度作成すると再利用されます
  3. アプリ プールを毎日 (午前 4 時) にリサイクルするように構成しましたが、例外の最初の発生もほぼ同じ時間枠に収まっていることに気付きました。
  4. この問題は、ユーザー (HTTP) 要求がアプリケーション プール リサイクルのウィンドウ内にある場合、IIS マルチスレッドと NHb セッション ファクトリの実装の組み合わせのように見えました。

解決

  1. 熱心な初期化に戻ります。つまり、NHb セッション ファクトリの初期化は Application_Start で行われます。
  2. そのため、HTTP ユーザー要求には「常に」使用する既成のセッション要素があります。

このアプローチは問題を解決しただけでなく、パフォーマンスの観点からも優れたオプションだと思います。特定のユーザー要求に重きを置くのではなく、セッション ファクトリの初期化というコストのかかる操作を熱心に行う方が、目前の問題をよりよく反映しています。

この変更されたバージョンを本番環境で 1 か月間問題なく実行しています。

于 2012-07-30T08:59:20.423 に答える