Frage

In meinem C # .NET 3.5-Anwendung ich CastleProject Active über NHibernate verwenden. Dies ist Desktop-Anwendung unter Verwendung von MS SQL Server 2008. Ich Set ADO Befehl Timeout muß 0 Timeout Ausnahme während der Massenoperationen zu verhindern:

  <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>

Allerdings erhalte ich noch Timeout Ausnahme! Die NHibernate Protokoll zeigt so etwas wie folgt aus:

Irgendwo am Anfang:

  

2010-10-02 06: 29: 47.746 INFO   NHibernate.Driver.DriverBase - Einstellung ADO.NET Befehl Timeout auf 0 Sekunden

Irgendwo am Ende:

  

2010-10-02 07: 36: 03.020 DEBUG   NHibernate.AdoNet.AbstractBatcher -   Geschlossen IDbCommand, offen IDbCommand s:   0 2010-10-02 07: 36: 03.382 ERROR   NHibernate.Event.Default.AbstractFlushingEventListener   - kann nicht chronize Datenbank-Status mit Sitzungs syn   NHibernate.HibernateException: Ein   Ausnahme aufgetreten ist, wenn die Ausführung   Batch-Abfragen ---> System.Data.S   qlClient.SqlException: Timeout   abgelaufen. Das Zeitlimit   vor der Beendigung der Opera tion   oder der Server antwortet nicht. beim   System.Data.SqlClient.SqlConnection.OnError (SqlException   Ausnahme, Boolean Breakconnection)

Wie kommt das? Wie dieses Problem beheben?

War es hilfreich?

Lösung

Es ist richtig, dass ein Wert von 0 kein Timeout gibt (wie in der MSDN-Dokumentation definiert ), aber während NHibernate des Fahrers übergibt den Konfigurationswert auf den db Befehl, wenn es> = 0 , der Zustand des batcher überprüft, ob der Wert> 0 .

Wenn Sie also eingestellt Dosieren auf, mit einem Timeout-Wert von 0, wird der Wert nicht auf den db Befehl übertragen, so dass es als Standard bleibt.

Es ist durchaus möglich, dass dies durch Design ist, und dass NHibernate Entwickler absichtlich deaktiviert Timeouts für die Batch-Szenarien zu deaktivieren. Deaktivieren Timeout ist eine schlechte Idee, wie auch immer, wenn Sie Probleme mit Timeout-Fehlern haben würde ich den Wert erhöhen, aber es nicht deaktivieren.

Bitte bestätigen Sie dies mit NHibernate Devs.

Andere Tipps

Sie suchen können das Timeout für bestimmte Abfragen zu setzen und nicht auf web.config Ebene (sonst Sie wirklich brauchen, um tune up Ihre Anwendung :)).

Ich habe vor kurzem fand diese Antwort, die mir geholfen:

Wie Nhibernate LINQ Befehl Timeout mit Session einstellen .Query

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top