Fehlerbehebung bei JPA-Deadlocks und -Transaktionszeitlimitüberschreitungen
Datenbankdeadlocks und Transaktionszeitlimitüberschreitungen sind das Ergebnis von Konkurrenzsituationen zwischen zwei oder mehr Clients, die versuchen, auf dieselbe Datenbankressource zuzugreifen. Ein Deadlock ist ein spezieller Fall, bei dem eine blockierende Schleifenbedingung zwischen zwei oder mehr Clients vorliegt. Die Clients blockieren sich gegenseitig, und keiner der Clients kann seine Operation fortsetzen. Gewöhnlich sind diese Phänomene keine Programmierfehler. Sie werden durch Geschäftslogik verursacht, die auf komplexe Weise mit gegenseitigen Abhängigkeiten auf Datenbankressourcen zugreift.
Informationen zu diesem Vorgang
Solche Bedingungen können durch den Einsatz bewährter Verfahren und Strategien minimiert werden.
Vorgehensweise
- Ermitteln Sie die betroffenen Datenbankressourcen, die den Fehler verursacht haben.
- Untersuchen Sie die Ausnahmen (sofern vorhanden). Beim Auftreten des Fehlers können Ausnahmen Aufschluss über die fehlerhaften Entitäten geben, die die Fehlerbedingung verursachen.
- Wenn der Standard-JPA-Provider von WebSphere Application Server verwendet wird, können Sie die Tracegruppe “eclipselink.logging.level.sql” aktivieren, um die SQL-Anweisungen und Threadinformationen der fraglichen Datenbankressourcen zu erfassen. Durch die Erfassung dieser Informationen können Sie die Clients und Entitäten ermitteln, die die Artefakte sind, die die Fehlerbedingung verursachen.
- Ein komplexeres Einsatzszenario finden Sie in der Datenbankdokumentation. In der Datenbankdokumentation finden Sie auch Informationen zu den speziellen Tools oder Techniken, mit deren Hilfe Sie die Objekte und die Transaktion ermitteln können, die den Datenkonflikt verursachen.
- Nachdem Sie die Probleme identifiziert haben, untersuchen Sie die
Geschäftslogik, die diese Ressourcen verwendet, um sicherzuerstellen, dass ihre Verwendung keinen länger anhaltenden Konflikt
verursacht. Es gibt keine vordefinierte Lösung für die Behebung von Deadlocks und Zeitlimitüberschreitungen.
Die Lösung ist weitgehend von der Komplexität der Geschäftslogik und der Entitätsbeziehungen abhängig.
Das Basiskonzept für die Behebung von Deadlock- und Zeitlimitüberschreitungsproblemen ist, die
Nutzungsdauer von Ressourcen auf ein Minimum zu reduzieren und anderen Clients den Zugriff auf dieselbe Ressource zu ermöglichen.
Wenn eine Konkurrenzsituation unvermeidbar ist, muss die Anwendung
Methoden für die Wiederherstellung definieren, falls solche Fehlerbedingungen auftreten.
Im Folgenden sind Strategien beschrieben, die Ihnen helfen können, die Problembedingungen
zu minimieren. Außerdem wird beschrieben, wie Sie feststellen können ob Sie eine oder mehrere dieser Strategien zur Behebung des Problems anwenden können:
- Stellen Sie sicher, dass die Geschäftslogik Entitäten nicht länger als unbedingt nötig sperrt. JPA-Anwendungen, die überwiegend schreibgeschützt sind, sollten standardmäßig die von JPA unterstützte Semantik für optimistisches Sperren verwenden. JPA 2.0 führt Funktionen für pessimistisches Sperren ein, die Anwendungen ermöglichen, Entitäten bei Bedarf explizit pessimistisch zu sperren. Sie sollten die Anzahl pessimistischer Sperren optimieren, die gleichzeitig angewendet werden. Zu viele Sperren erhöhen das Risiko von Deadlocks und Zeitlimitüberschreitungen und beeinträchtigen die gemeinsamen Zugriffe und den Durchsatz der Anwendung.
- Vermeiden Sie die Festlegung von Isolationsstufen für Datenquellenverbindungen, die restriktiver sind als unbedingt nötig. Die Isolationsstufe hat auf Verbindungsebene denselben Effekt wie die Semantik für pessimistisches Sperren. JPA erfordert die Mindestisolationsstufe "read-committed", um einen grundlegenden Schutz der Datenintegrität zu erreichen. Die Standardisolationsstufe des Verbindungsmanagers von WebSphere Application Server ist datenbankspezifisch. Informationen zur Spezifikation der API "JDBCConnectionSpec" finden Sie im Artikel über die Programmierschnittstellen.
- Minimieren Sie die Dauer jeder aktiven Transaktion. Aktive Transaktionen mit längeren Laufzeiten bergen das Risiko, dass Ressourcen, die von anderen Clients benötigt werden, zurückgehalten werden. Schreiben Sie alle Transaktionen fest, sobald alle Ressourcen verarbeitet wurden.
- Optimieren Sie die Geschäftslogik, um gegenseitige Abhängigkeiten von Entitäten zu vermeiden. Wenn zwei Sätze von Geschäftslogik ähnliche Ressourcen verwenden, sollten Sie die Ressourcen in derselben Reihenfolge aktualisieren, um die klassische Schleifenabhängigkeit bei Deadlocks zu vermeiden. Dies ist von der verwendeten Isolationsstufe abhängig. Die Isolationsstufe hat denselben Effekt wie die Anwendung einer impliziten Sperre auf die Ressourcen, wie in der nächsten Strategie beschrieben wird.
- Verwenden Sie pessimistisches Sperren, um gleichzeitige Zugriffe auf gemeinsame Ressourcen zu synchronisieren. Wenn die zuvor beschriebenen Strategien auf Ihre Situation nicht anwendbar sind, ist pessimistisches Sperren eine Alternative für die Synchronisation der Zugriffe auf gemeinsame Ressourcen, die von verschiedenen Clients parallel genutzt werden. Die Anwendung kann die Funktionen für pessimistisches Sperren von JPA 2.0 verwenden, um den Zugriff anderer Clients auf die gemeinsame Ressource zu blockieren, bis die Transaktion festgeschrieben oder rückgängig gemacht wird. Eine verstärkte Verwendung pessimistischer Sperren kann sich nachteilig auf gemeinsame Zugriffe und Durchsatz auswirken. WebSphere Application Server JPA Access Intent ist ebenfalls eine Alternative für das Sperren von Datenressourcen, die auf dem EJB-Aufruf oder auf dem Namen einer benutzerdefinierten Task basieren.
- Behandeln und beheben Sie die Deadlock- und Zeitlimitüberschreitungsausnahme. Die meisten Datenbankserver haben einen integrierten Mechanismus zur Verhinderung von Deadlocks. Wenn dieser Mechanismus eine Deadlockbedingung erkennt, ist die gewöhnlich von der Datenbank angewendete Strategie, eine der Anforderungen abzubrechen und die andere zu bearbeiten. Die Anforderung, die beendet wird, ist jedoch datenbankspezifisch und nicht deterministisch. Wenn eine Anwendung es zulässt, empfiehlt es sich, die Deadlockbedingung zu beseitigen und die Operation zu wiederholen.
Zugehörige Konzepte:
Zugehörige Tasks:
Zugehörige Verweise:


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpadeadlock
Dateiname:tejb_jpadeadlock.html