2017-12-20 39 views
0

Ich verwende Castle ActiveRecord als mein ORM in meiner ASP.NET-Webanwendung. Ich benutze ihren SessionPerRequest-Ansatz und das funktioniert gut. Wenn jedoch ein Fehler auf Datenbankebene auftritt (z. B. ein Constraint-Fehler beim Löschen eines Elements oder ein Trunkierungsfehler (String oder binäre Daten werden abgeschnitten), bekomme ich Timeouts mit allen Abfragen, die ich nach dem Fehler ausgeführt habe. Das passiert für etwa zehn Minuten, dann läuft wieder alles gut. Ich denke, das hat damit zu tun, dass die Transaktion nicht korrekt abgeschlossen wird. Ich kann anscheinend keine Möglichkeit finden, die Transaktion nach einem Fehler korrekt zu schließen, also versuche ich jetzt, die Auswirkungen zu minimieren. Ich habe versucht, Command Timeout und Connection Timeout auf eine kleinere Zahl zu setzen, aber das scheint nicht zu funktionieren. Hat jemand eine Idee, wie man dieses Problem lösen kann?SQL-Timeout nach Datenbankausnahmen

+0

Es ist offensichtlich, dass 'SessionPerRequest' überhaupt nicht gut funktioniert. Sobald Sie eine Ausnahme von der Datenbank erhalten, ist die Sitzung nutzlos. Und wenn Sie eine * Transaktion * für die Dauer einer Sitzung offen halten, haben Sie einen schwerwiegenden Fehler. Sitzung pro Anfrage bezogen auf * Anwendungscontainer * wie EJB und Spring und die * Sitzungsfabriken *, * NICHT * die Datenbankverbindungen und Transaktionen. Wenn Sie eine Transaktion so lange offen halten, erhalten Sie übermäßige Sperrung, Blockierung, Timeouts usw. –

+1

BTW NHibernate war * nie * ausnahmesicher. Eine NH-Sitzung ist ungültig, wenn eine Ausnahme auftritt, nicht nur eine Datenbankausnahme.Eine * database * -Ausnahme bedeutet jedoch, dass Ihre Transaktion zurückgesetzt wurde und die Verbindung wahrscheinlich geschlossen wurde. Was auch immer, die NH-Sitzung ist nutzlos und muss verworfen werden. Speichern Sie die * SessionFactory * wenn Sie möchten, aber * lassen Sie die Sitzung nicht länger als nötig geöffnet. –

Antwort

0

soweit ich Ihre Situation verstehen können, gibt es zwei mögliche Quellen für Ihr Problem:

1. Daten-Basis-Server-Konfiguration Sie haben uns nicht tould wich Datenbank, die Sie verwenden, also kann ich nur raten. Wenn die SQL-Befehle Sperren verursachen, könnten sie auf den alten Befehl warten, der eine Ausnahme verursachte und niemals auflösen (alias TimeOut). Wenn die Transaktion in einer Protokolldatei gespeichert wird, ist die Protokolldatei möglicherweise physisch voll (sehr unwahrscheinlich) und es können keine zukünftigen Befehle gespeichert werden, bis der alte Befehl, der eine Ausnahme verursacht hat, aufgelöst wird (aka. TimeOut). Es kann - abhängig vom Datenbanksystem - hunderte andere Gründe für den Fehler geben. In einer anderen Art und Weise ist es einfach zu testen und wenn es von der Datenbank verursacht wird, dann können Sie einfach eine neue Anfrage mit nur den SQL-Befehlen, keinem NHibernate und mehr für die Datenbank-Experten starten. Wie testen, wenn es sich um ein Datenbankkonfigurationsproblem handelt? Einfach. Sie müssen nur den Fehler verursachen und dann das Verwaltungstool (z. B. MS SQL Server Management Studio, Oracle SQL Developer usw.) verwenden, um denselben SQL-Befehl zu senden, den Ihre Software sendet. Wenn dieser Befehl vom Verwaltungstool dieselben Probleme wie Ihre Software hat, handelt es sich um ein Problem bei der Datenbankkonfiguration, und Sie sollten es nur innerhalb der Datenbank reproduzieren und lösen können. Wenn der Befehl aus dem Verwaltungstool ohne Zeitüberschreitung aufgelöst wird, liegt das Problem innerhalb des Codes oder der Konfiguration Ihrer Software.

2. SessionPerRequest nicht funktioniert Ich denke, dass mit „etwa 10 Minuten lang passiert“ Sie bedeuten, dass nach dem die Software nicht für 10 Minuten unter Verwendung von (Kreisverkehr) das Problem anhält. Ich schätze auch, dass das Problem länger als 10 Minuten bestehen bleibt, wenn Sie weiterhin neue Anfragen von Ihrem Browser an den Server (IIS) senden, ohne dass es zu längeren Unterbrechungen kommt. Dies würde bedeuten, dass entweder die IIS-Web-Sitzung oder der IIS-Anwendungspool (beide von Ihrer Software verwendet) eine Zeitüberschreitung erhalten und somit jede statische Variable, jede Sitzungsvariable und jede NHibernate-Sitzung, in der sie gespeichert sind, entsorgt werden Dort! Wenn Sie eine SessionPerRequest-Lösung verwenden möchten, um dieses Problem zu vermeiden, müssen Sie selbst einen SessionPerRequest-Ansatz implementieren! ! Sie müssen in Ihrer Anwendung Code haben, der zu Beginn einer Anfrage eine neue NHibernate-Sitzung erstellt und am Ende der Anfrage eine eigene NHiberante-Sitzung bereitstellt, die nicht in NHibernate selbst codiert ist und nicht aktiviert werden kann Bei jeder Konfiguration müssen Sie es selbst programmieren.

Grüße Juy Juka

Verwandte Themen