1

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() は、私のコンテキストでは受け入れられないバリアントです)?

4

2 に答える 2

2

いくつか検索したところ、問題は構成にあることがわかりました。構成にhttpモジュールが欠落しているSpringWebSupportModuleがあったため、正しいものは次のとおりです。

    <httpModules>
      <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
      <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31"/>  
    </httpModules>

だからMarijn は正しかった-それは春への弱い配線だった。

于 2012-06-13T06:01:18.950 に答える
1

OpenSessionInViewModule1. ?用に構成されたセッション ファクトリ

のセッション ファクトリを構成するのを忘れている可能性がありますOpenSessionInViewModule

<appSettings>
  <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" 
       value="SessionFactory"/>
</appSettings>

これは、アプリの設定で行う必要があります。

2. FluentNHibernate ベースのスプリング セッション ファクトリを修正しますか?

コードでセッション ファクトリを構成しているようです。ドキュメントや BennyMのブログで説明されているように、セッション ファクトリの構成を試みましたか? メソッドは、すべてのspring.netサポートをバイパスして、Fluent NHibernate から直接セッション ファクトリを返します。NewSessionFactory

3. セッション ファクトリ トランザクションは認識されていますか?

<object id="SessionFactory" 
        type="IndustryTracker.NHibernateRepository.FluentSessionFactory, IndustryTracker.NHibernateRepository">
  <property name="DbProvider" ref="DbProvider" />
  <!-- provides integation with Spring's declarative transaction management features -->
  <property name="ExposeTransactionAwareSessionFactory" value="true" /> 
</object>

4. コントローラーにはスコープ定義の依存関係がありますか、scope="application"またはスコープ定義がありませんか?

ここで間違った方向を見ていたのかもしれません。applicationコントローラーにスコープの依存関係がある場合、クイック リクエストが干渉する可能性があることを意味します。デフォルトは"scope="application"; そのため、スコープ定義なしでコラボレーターもチェックする必要があります。Web スコープに関するドキュメントを参照してください。

于 2012-06-11T14:43:16.763 に答える