NHibernate でのトランザクションおよびセッション管理に Spring.NET AOP を使用しています。ユーザーが複数のリクエストをあまりにも迅速に行うと、遅延読み込みが失敗し、「セッションがないか、セッションが閉じられていません」という例外が発生します。
NHibernate 構成で SpringSessionContext を CurrentSessionContext として使用します
public class FluentSessionFactory : LocalSessionFactoryObject
{
protected override ISessionFactory NewSessionFactory(Configuration config)
{
var conf = Fluently
.Configure()
.Database(
MsSqlConfiguration
.MsSql2008
.ConnectionString(c => c.FromConnectionStringWithKey("MyConnection"))
// TODO: use ExposeConfiguration method
.CurrentSessionContext<SpringSessionContext>()
)
.Mappings(
m => m.FluentMappings
.AddFromAssembly(this.GetType().Assembly)
)
.BuildSessionFactory();
return conf;
}
}
xml 構成:
<object id="SessionFactory" type="IndustryTracker.NHibernateRepository.FluentSessionFactory, IndustryTracker.NHibernateRepository">
<property name="DbProvider" ref="DbProvider" />
</object>
および OpenSessionInView モジュール
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31"/>
</modules>
</system.webServer>
アプリケーションは、データベースからエンティティを取得するための次のワークフローを実装します: ビュー -> コントローラー -> マネージャー -> リポジトリと同じように反対側に。したがって、セッションはリクエストごと、トランザクションごと、つまりマネージャーへの呼び出しごとに作成されます。
<object id="TransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate31">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="SessionFactory"/>
</object>
<tx:advice id="TxAdvice" transaction-manager="TransactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<object id="Pointcut" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
<property name="patterns">
<list>
<value>MyAppication.Managers.AccountManager</value>
<value>MyAppication.Managers.CompanyManager</value>
</list>
</property>
</object>
<aop:config>
<aop:advisor advice-ref="TxAdvice" pointcut-ref="Pointcut"/>
</aop:config>
このような動作の考えられる理由と、この問題を解決するにはどうすればよいですか (Not.LazyLoad() と NHibernateUtil.Initialize() は、私のコンテキストでは受け入れられないバリアントです)?