3

私のC#.NET 3.5アプリケーションでは、NHibernate上でCastleProjectActiveRecordを使用しています。これは、MS SQL Server 2008を使用するデスクトップアプリケーションです。一括操作中のタイムアウト例外を防ぐために、ADOコマンドのタイムアウトを0に設定しました。

  <activerecord>
    <config>
      ...
      <add key="hibernate.command_timeout" value="0" />
    </config>
  </activerecord>

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

ただし、まだタイムアウト例外が発生しています。NHibernateログには次のようなものが表示されます。

最初のどこか:

2010-10-02 06:29:47,746INFONHibernate.Driver.DriverBase-ADO.NETコマンドのタイムアウトを0秒に設定します

最後のどこか:

2010-10-02 07:36:03,020 DEBUG NHibernate.AdoNet.AbstractBatcher-IDbCommandを閉じ、IDbCommandを開きます:0 2010-10-02 07:36:03,382エラーNHibernate.Event.Default.AbstractFlushingEventListener-データベースの状態を同期できませんでしたセッションNHibernate.HibernateException:バッチクエリの実行中に例外が発生しました---> System.Data.S qlClient.SqlException:タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。System.Data.SqlClient.SqlConnection.OnError(SqlException例外、ブール値breakConnection)で

どうして?これを修正する方法は?

4

2 に答える 2

5

値0はタイムアウトがないことを示します(MSDNドキュメントで定義されています)が、NHibernateのドライバーは> = 0のときにconfig値をdbコマンドに渡しますが、バッチャーの条件は値が>0であることを確認します

したがって、タイムアウト値0でバッチ処理をオンに設定すると、値はdbコマンドに引き継がれないため、デフォルトのままになります。

これは仕様によるものであり、NHibernate開発者がバッチシナリオのタイムアウトの無効化を意図的に無効にした可能性は十分にあります。とにかくタイムアウトを無効にすることは悪い考えです。タイムアウトエラーで問題が発生した場合は、値を上げますが、無効にはしません。

NHibernate開発者にこれを確認してください。

于 2010-10-03T13:10:37.860 に答える
0

web.configレベルではなく、特定のクエリのタイムアウトを設定しようとしている可能性があります(そうでない場合は、アプリケーションを実際に調整する必要があります:))。

私は最近、私を助けたこの答えを見つけました:

Session.Queryを使用してNhibernateLINQコマンドタイムアウトを設定する方法

于 2014-03-25T21:00:53.107 に答える