Heute habe ich ein Problem mit Timeouts erlebt.
Ich habe die folgende Konfiguration, die verwendet wird, um eine SessionFactory zu erstellen:
%Vor%Ich speichere es nicht in web.config, sondern in einer XML-Datei, die manuell an die Konfiguration übergeben wird:
%Vor%Somit kann ich mehrere Session-Factories (pro Datenbank) mit unabhängigen Konfigurationen haben.
Aber command_timeout
scheint nur dann effektiv zu sein, wenn NHibernate keine Stapel verwendet. Wenn SQL-Befehle stapelweise vorliegen, dann bekomme ich für einige große Stapel:
Beim Suchen nach einer Lösung habe ich einen Artikel gefunden, der erklärt, warum das so ist: Ссылка
Die Ursache des Problems liegt darin, dass NHibernate beim SQL-Batching Cfg.Environment.CommandTimeout anstelle von command_timeout
verwendet, das beim Erstellen einer Sitzung an eine Konfiguration übergeben wird.
Ich habe eine Möglichkeit gefunden, eine Problemumgehung beim Erstellen einer Konfiguration zu implementieren:
%Vor%und jetzt sagen meine Kollegen, dass die Zeitüberschreitung jetzt anscheinend behoben ist.
Aber was mich verwirrt, ist der folgende Thread: Ссылка
was sagt:
Die Eigenschaft NHibernate.Cfg.Environment.Properties gibt Ihnen eine Kopie zurück der globalen Eigenschaften, so dass Sie sie nicht ändern können.
Wenn NHibernate.Cfg.Environment.Properties eine schreibgeschützte Kopie ist, warum scheint meine Problemumgehung dann ordnungsgemäß zu funktionieren? Ist es stabil oder ist diese Korrektur unzuverlässig und könnte in anderen Fällen auftreten?
Und außerdem habe ich ein ähnliches Problem in NHibernate JIRA gefunden: Ссылка
Wenn sie sagen, dass sie Probleme mit command_timeout in v3.1.0. behoben haben, warum muss ich dann meine Abhilfe in NHibernate v3.3.2 verwenden. ?
Hat jemand dazu einen Einblick?
Ich hatte dasselbe Problem bei der Verwendung von Batches. Nhibernate-Klasse SqlClientBatchingBatcher mit Befehlszeitüberschreitung von Environment.GlobalProperties, die schreibgeschützt ist. Ich habe nur zwei Möglichkeiten gefunden, um den Timeout für den SqlClientBatchingBatcher.currentBatch-Befehl
zu setzen1) Verwenden Sie das Timeout in der Datei app.config
%Vor%2) setze die Umgebung.
%Vor%Tags und Links timeout nhibernate batch-processing