2017-04-21 2 views
0

Je crée une application Springboot avec OpenJPA. Mon exigence est que j'ai besoin de se connecter dynamiquement à plusieurs sources de données et que les informations d'identification de la source de données sont obtenues au moment de l'exécution en appelant des points de terminaison.Création dynamique d'une source de données dans l'application SpringBoot OpenJPA (implémentation de la mutualisation avec OpenJPA)

Voici la classe contrôleur:

@RestController 
public class StationController { 

@Autowired 
BasicDataSource dataSource; 

J'ai un service qui me renvoie le jdbc_url en fonction du nom du client:

public String getDSInfo(String customername){ 
    // code to get the datasource info (JDBC URL) 
} 

Mes questions sont les suivantes:

  1. Existe-t-il un moyen de créer des sources de données à l'exécution en obtenant des informations d'identification de source de données en appelant ainsi moi autre service (qui prend l'identifiant du client et renvoie la source de données spécifique au client)? Comme mon application est une application Web, de nombreux clients y accèderont en même temps, alors comment créer et gérer autant de sources de données différentes?

REMARQUE:

  1. Le code obtenir des informations sur la source de données spécifiques à la clientèle seulement en tirant un service à l'exécution, je ne peux pas hardcode les informations d'identification de source de données dans le fichier de configuration XML.

  2. J'ai trouvé quelques implémentations avec Hibernate mais j'utilise Springboot avec OpenJPA. Donc, besoin d'aide spécifique OpenJPA.

Répondre

0

Il semble que vous souhaitiez une solution multiclient.

Les sources de données sont faciles à créer par programme, il suffit d'utiliser DataSourceBuilder avec vos détails de connexion provenant d'une source centrale (par exemple, une base de données de configuration centrale ou Spring Config Server).

Ensuite, vous aurez besoin de regarder un cadre de multi-location pour lier les sources de données aux clients.

Voir ici:

https://www.youtube.com/watch?v=nBSHiUTHjWA

et ici

https://dzone.com/articles/multi-tenancy-using-jpa-spring-and-hibernate-part

La vidéo est une montre longue mais un bon. Fondamentalement, vous avez une carte des sources de données client (de la mémoire) qui permettent à un entityManager de récupérer une source de données à partir de la carte en utilisant une portée personnalisée de «client» qui est définie lorsqu'un utilisateur d'un client particulier se connecte votre application

+0

Laissez-moi essayer. Cette solution fonctionne-t-elle également si plusieurs clients accèdent à l'application en même temps? –

+0

Oui, c'est l'idée. Une coutume particulière pourrait arriver à l'application en transmettant un code spécifique au client sur l'URL.Lorsqu'ils se connectent, ils sont définis sur un thread local, puis à partir de ce moment lorsqu'ils accèdent à des données via votre gestionnaire d'entités personnalisé, entitymanager saisit la source de données du client à partir de la map. La magie est l'utilisation d'une portée personnalisée client. Tout cela est expliqué dans les 10-15 dernières minutes de la vidéo. – PaulNUK

+0

Merci pour les liens, sont-ils également applicables pour l'application printanière OpenJPA? –