2016-04-21 3 views
0

In Spring-Anwendungen (die die deklarative Transaktionsverwaltung von Spring verwenden) wird bei der Verwendung von JPA/Hibernate eine Hibernate-Sitzung erstellt und eine Datenbankverbindung von einer Datenquelle abgerufen, um diese erste Transaktion auszuführen . Jede nachfolgende Transaktion in der Anfrage wird die Sitzung und die Verbindung wiederverwenden. Gibt es eine Möglichkeit, Hibernate (oder das Transaktionsverwaltungssystem von Spring) dazu zu zwingen, eine neue Verbindung von der Datenquelle für die nachfolgende Transaktion zu erhalten?Gibt es eine Möglichkeit, Hibernate zu zwingen, neue Verbindung für nächste Transaktion innerhalb einer Spring-Anwendung zu verwenden?

Hintergrundinformationen und was ich versuche zu erreichen

Ich bin eine benutzerdefinierte Implementierung von AbstractRoutingDatasource zu routen Datenbankanfragen zwischen einem Master und einem Slave repliziert mit (read-only) Datenbank. Ich habe eine benutzerdefinierte Annotation mit Datenquellenroutinginformationen und AOP Aspect erstellt, die die mit meinen benutzerdefinierten Annotations annotierten Methoden abfängt, um ein Framework zu erstellen, in dem zusätzlich zu @Transactional eine zusätzliche Datenquellenrouting-Annotation hinzugefügt werden kann, um eine Datenquelle (Master oder Slave) auszuwählen), auf dem die Transaktion ausgeführt werden soll. Aspect informiert die Routing-Datenquelle darüber, dass die nächste Verbindung, die im aktuellen Thread angefordert wurde, vor dem Start der Transaktion an eine bestimmte Datenquelle (wie in der Anmerkung definiert) gesendet werden soll. Das Problem ist, dass dies nur bei der ersten Transaktion funktioniert, weil Hibernate die Verbindung zwischenspeichert und keine neue für die nächste Transaktion anfordert.

Antwort

0

Sie müssen eine benutzerdefinierte ConnectionProvider implementieren. Hibernate wird standardmäßig mit DriverManagerConnectionProviderImpl geliefert. Die meisten Leute verwenden jedoch c3p0 (viele, ohne es zu wissen), proxool, Hikari oder eine andere Implementierung.

Alle diese (einschließlich Standard Hibernate) werden Verbindungen zwischenspeichern (es ist ihr primärer Zweck). Wahrscheinlich müssen Sie einen Verbindungsanbieter erstellen, der auf zwei andere Verbindungsanbieter verweist (einer pro Datenquelle). Die internen Verbindungsanbieter können c3p0 oder eine andere Implementierung sein, die Sie verwenden möchten.

This article gibt einen guten grundlegenden Überblick über das Konzept (und beschreibt auch, welche Eigenschaft eingestellt werden soll, um Ihre eigenen zu liefern).

Verwandte Themen