13

デフォルトの 30 秒よりも長い時間がかかる、実行時間の長いバックエンド プロセスがいくつかあります。

NHibernate のバージョンは 2.0.1.4000 で、Spring.NET は 1.2.0.20313 です。NHibernate は、Spring.NET を介して次のように構成されます。

<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20">
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="MappingAssemblies">
        <list>
            <value>SomeKindOfAnItem</value>
        </list> 
    </property>
    <property name="HibernateProperties">
        <dictionary>
            <entry key="expiration" value="120"/>
            <entry key="adonet.batch_size" value="10"/>
            <entry key="cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache"/>
            <entry key="cache.use_query_cache" value="true"/>
            <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
            <entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
            <entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
            <entry key="current_session_context_class" value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate20"/>
            <entry key="show_sql" value="false"/>
        </dictionary>
    </property>
</object>

これを回避するために、Web.config で NHibernate の command_timeout を 60 に設定しようとしています。これは Web.config からのものです。

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="command_timeout">60</property>
  </session-factory>
</hibernate-configuration>

残念ながら、これは機能しません。コマンドは 30 秒後にタイムアウトします。

Web アプリと同じように DAO を呼び出すコンソール アプリを作成しました。構成ファイルにまったく同じNHibernate構成設定があります。IDbCommand は、構成ファイルの設定を正常に使用して、30 秒ではなく 60 秒後にタイムアウトします。

アプリのデバッグを試み、Web サイトから DAO アセンブリが呼び出されたときに commandTimeout が設定されているかどうかを確認しました。そうだった。

これは、Visual Studio ウォッチからのものです。

((NHibernate.Driver.DriverBase)(((NHibernate.Connection.DriverConnectionProvider) ((NHibernate.Impl.SessionFactoryImpl)session.SessionFactory) .ConnectionProvider).Driver)).commandTimeout: 60

セッションは次のように作成されます。

ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);

私の質問は、コマンド タイムアウト フィールドが Web.config から 60 に正常に設定された場合、30 秒後にタイムアウトになるのはなぜですか? 私が試すことができるアイデアはありますか?

4

1 に答える 1

12

hibernate.connection.connection_string プロパティの一部としてタイムアウトを設定できます。Spring.Net を使用したことがないため、NHibernate セッション ファクトリをどのようにセットアップするのかわかりません。接続文字列に「Connect Timeout=120」を追加できる場合。これにより、タイムアウト時間がデフォルトの 30 秒から 120 秒に増加します。

次の行は次のようになりweb.configます。

<property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=; Connect Timeout=120;</property>

編集

実際には 2 つのタイムアウトがあることがわかります。それを指摘してくれたadokosに感謝します。1 つは接続を実際に開くためのもので、もう 1 つは実行されるクエリのためのものです。

接続用のものは上に表示されていますが、NHibernate でクエリのタイムアウトを設定するには、ICriteriaインターフェイスを使用します。

ICriteria crit = session.CreateCriteria(typeof(Foo)); 
crit.SetTimeout(120); 
List<Foo> fooList = crit.List();

タイムアウト値は秒単位です。

それが役立つことを願っています

于 2010-02-25T07:36:57.607 に答える