2016-09-01 3 views
7

Meine Anwendung basiert auf Spring Boot, Hibernate, MySQL und verwendet Spring Data JPA, um sie zu verknüpfen.Mehrere Datenquellen im Spring Boot Repository mit Anmerkungen versehene Schnittstelle

Anwendungsfall ist die Verwendung von Slave-DB-Knoten für schwere Lesevorgänge, um zu vermeiden, dass der gesamte Datenverkehr vom Master-MySQL-Knoten bedient wird. Eine Möglichkeit, dies zu erreichen, besteht darin, mehrere Entity Manager auf separate Datenquellen (einen Master und einen anderen Slave) zu zeigen. Dieser Weg wurde in den folgenden SO Fragen und Blogs recht gut erklärt.

Spring Boot, Spring Data JPA with multiple DataSources

https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-and-spring-data-jpa/

Wo ich stecken bin, ist zu verstehen, wenn es eine Möglichkeit, die ich verschiedenen Entity-Manager für verschiedene Anwendungsfälle in meinem Repository Kommentiert Schnittstelle injizieren.

Die einzige Möglichkeit, die ich sehe, ist das Erweitern des Repository mit einer benutzerdefinierten Implementierung, die benutzerdefinierte Entitätsmanager verwendet, die wie unten mit relevantem persistenceContext versehen sind.

public interface CustomerRepository extends JpaRepository<Customer, Integer>, MyCustomCustomerRepository{ 
} 

public class MyCustomCustomerRepositoryImpl implements MyCustomCustomerRepository { 

     @PersistenceContext(unitName = "entityManagerFactoryTwo") 
     EntityManager entityManager; 
} 

Ich möchte diese benutzerdefinierte Implementierung vermeiden. Jede Hilfe bei der Lösung dieses Anwendungsfalles (der meiner Meinung nach sehr verbreitet sein sollte) wäre willkommen.

ANMERKUNG: Entitäten sind in beiden Datenbanken identisch, sodass separate Pakete für das Scannen von Entitäten und ähnliche Lösungen möglicherweise nicht funktionieren.

+0

Does [diese Probe] (https://github.com/snicoll-demos/demo-multi-entity-managers/) hilft? –

+1

Demo Sie shared hat zwei verschiedene Entitäten in verschiedenen dbs. Konflikte bei der Verwendung von zwei Entity Managern für einen solchen Fall können einfacher vermieden werden. Für mich bleiben Entitäten gleich, ob wir sie für Master oder Slave db verwenden. –

Antwort

3

Hier ist ein schönes Beispiel, das Sie verwenden können: dynamic-datasource-routing-with-spring. Im Inneren finden Sie einen AbstractRoutingDatasource + einen Interzeptor für eine benutzerdefinierte Annotation, die die Service-Methode an eine erforderliche Datenbank bindet. Sie können jedoch nur Datenquellenschalter explizit verwenden.

+0

Obwohl das Beispiel mit xml-configs funktioniert und mein Projekt meistens annotationsgesteuert ist, gibt mir die Antwort einen guten Überblick darüber, wie man die Funktionalität erreicht. Vielen Dank :) –

Verwandte Themen