2017-04-21 3 views
0

Ich erstelle eine Springboot-Anwendung mit OpenJPA.Dynamische Erstellung einer Datenquelle in SpringBoot OpenJPA-Anwendung (Multitenancy mit OpenJPA implementieren)

Meine Anforderung ist, dass ich mich dynamisch mit mehreren Datenquellen verbinden muss und die Anmeldeinformationen der Datenquelle zur Laufzeit erhalten, indem ich einige Ruhe-Endpunkte aufrufen. Hier

ist die Controller-Klasse:

@RestController 
public class StationController { 

@Autowired 
BasicDataSource dataSource; 

Ich habe einen Dienst, der mir die jdbc_url auf den Kundennamen abhängig zurück:

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

Meine Fragen sind:

  1. Gibt es einen Weg, auf dem ich Datenquellen zur Laufzeit erstellen kann, indem ich Datenquellenanmeldeinformationen durch Aufrufen von so erhalten mir anderen Dienst (der die Kundennummer übernimmt und die kundenspezifische Datenquelle zurückgibt)?

  2. Da es sich bei meiner Anwendung um eine webbasierte Anwendung handelt, greifen viele Kunden gleichzeitig darauf zu, um so viele verschiedene Datenquellen zu erstellen und zu verarbeiten.

HINWEIS:

  1. Der Code wird nur Informationen über die kundenspezifische Datenquelle erhalten, indem einen Dienst zur Laufzeit abfeuern, so kann ich nicht die Datenquelle Anmeldeinformationen in der XML-Konfigurationsdatei codieren.

  2. Ich habe einige Implementierungen mit Hibernate gefunden, aber ich benutze Springboot mit OpenJPA. Brauche also OpenJPA-spezifische Hilfe.

Antwort

0

Es klingt, als ob Sie eine Multi-Tenancy-Lösung wünschen.

Datenquellen können einfach programmgesteuert erstellt werden, verwenden Sie einfach einen DataSourceBuilder mit Ihren Verbindungsdaten, die von einer zentralen Quelle (z. B. einer zentralen Konfigurationsdatenbank oder Spring Config Server) abgerufen werden.

Dann müssen Sie ein Multi-Tenancy-Framework betrachten, um die Datenquellen zurück an die Clients zu binden.

Siehe hier:

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

und hier

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

Das Video ist eine lange Uhr aber ein guter. Grundsätzlich haben Sie eine Karte von Kundendatenquellen (aus dem Speicher), die es einem EntityManager ermöglicht, eine Datenquelle aus der Karte aufzunehmen, indem ein benutzerdefinierter Quellbereich von "Kunde" verwendet wird, wenn ein Benutzer für einen bestimmten Kunden sich irgendwie anmeldet deine App

+0

Lassen Sie mich es versuchen. Funktioniert diese Lösung auch, wenn mehrere Kunden gleichzeitig auf die Anwendung zugreifen? –

+0

Ja, das ist die Idee. Ein bestimmter Benutzer könnte die App erreichen, indem er einen kundenspezifischen Code an die URL übergibt.Wenn sie sich anmelden, wird dies auf einen lokalen Thread gesetzt, und von da an, wenn sie über ihren benutzerdefinierten Entitätsmanager auf Daten zugreifen, greift der Entitymanager die Datenquelle des Kunden aus der Karte. Die Magie ist die Verwendung eines kundenspezifischen Bereichs. Dies alles wird in den letzten 10-15 Minuten des Videos erklärt. – PaulNUK

+0

Danke für die Links, gelten diese auch für die Spring-OpenJPA-Anwendung? –