7 votes

Sources de données multiples dans l'interface annotée de Spring Boot Repository

Mon application est basée sur Spring Boot, Hibernate, MySQL en utilisant Spring Data JPA pour les assembler.

Le cas d'utilisation est d'utiliser le nœud de base de données esclave pour effectuer des opérations de lecture lourdes afin d'éviter que tout le trafic soit servi par le nœud mysql maître. Une façon d'y parvenir est d'avoir plusieurs gestionnaires d'entités pointant vers des sources de données distinctes (une vers le nœud maître et une autre vers le nœud esclave). Cette méthode a été très bien expliquée dans les questions et blogs de SO ci-dessous.

Spring Boot, Spring Data JPA avec plusieurs DataSources

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

Là où je suis bloqué, c'est de comprendre s'il existe un moyen d'injecter différents gestionnaires d'entités pour différents cas d'utilisation dans mon interface annotée de référentiel.

La seule façon de le faire est d'étendre le référentiel avec une implémentation personnalisée qui utilise un gestionnaire d'entité personnalisé annoté avec le contexte de persistance approprié comme ci-dessous.

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

public class MyCustomCustomerRepositoryImpl implements MyCustomCustomerRepository {

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

Je voudrais éviter de faire cette mise en œuvre personnalisée. Toute aide pour résoudre ce cas d'utilisation (qui devrait être très courant) serait appréciée.

NOTE : Les entités sont les mêmes dans les deux bases de données, donc donner des paquets séparés pour l'analyse des entités et des solutions similaires pourrait ne pas fonctionner.

4voto

cra6 Points 371

Voici un bel échantillon que vous pouvez utiliser : dynamic-datasource-routing-with-spring . À l'intérieur, vous trouverez un AbstractRoutingDatasource + un intercepteur pour une annotation personnalisée qui relie la méthode du service à une base de données requise. Cependant, vous pouvez simplement utiliser le commutateur de source de données explicitement.

2voto

Himanshu Virmani Points 990

Vous trouverez ci-dessous la demande de modification qui montre la différence et la façon dont j'ai fait fonctionner la plupart des configurations avec des annotations au lieu de xml. Elle est basée sur la réponse de Cra6 ci-dessus, c'est-à-dire l'utilisation de la capacité RoutingDataSource de Spring.

https://github.com/himanshuvirmani/rest-webservice-sample/pull/1/files

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X