Grundsätzlich haben die Artikel im Internet nur mehrere Datenquellen oder nur dynamische Datenquellen, während neuere Projekte gleichzeitig zwei Methoden anwenden müssen. Nehmen wir die Konfigurationsmethoden für Ihre Referenz auf.
Anwendungsszenarien
Das Projekt muss gleichzeitig zwei verschiedene Datenbanken A und B verbinden, und es handelt sich um Master-Slave-Architekturen, eine Schreibbibliothek und mehrere lesende Bibliotheken.
Mehrere Datenquellen
Zunächst müssen Sie die mit Spring Boot gelieferte DataSourceAutoConfiguration deaktivieren, da die Feder.DataSource.* Eigenschaft der Datei application.Properties lautet und automatisch eine einzelne Datenquelle konfigurieren. Fügen Sie einfach das Ausschlussattribut zur Annotation @springbootApplication hinzu:
@SpringbootApplication (exclude = {dataSourceAutoConfiguration.class}) öffentliche Klasse TitanWebApplication {public static void main (String [] args) {SpringApplication.run (TitanWebapplication.Class, Argums); }}Konfigurieren Sie dann die Information mit Multi-Data-Quellenverbindung in application.Properties:
# Titan Library spring.datasource.titan-master.url = jdbc: mysql: // xxxx: port/titan? charakterencoding = utf-8spring.datasource.titan-master.u sername = spring.datasource.titan-master.password = spring.datasource.titan-master.driver-class-name = com.mysql.jdbc.driver# Konfiguration des Verbindungspools## andere Bibliotheken auszulassen spring.datasource.db2.url = jdbc: mysql: // xxxx: port/titan2? charakterencodierung = utf-8spring.datasource.db2.username = spring.datasource.db2.password = spring.datasource.db2.driver-classe-name = com.mysql.jdbc.driver-name =
Da wir die automatische Datenquellenkonfiguration deaktiviert haben, müssen wir diese Datenquellen im nächsten Schritt manuell erstellen:
@Configurationpublic class DataSourceConfig { @Bean(name = "titanMasterDS") @ConfigurationProperties(prefix = "spring.datasource.titan-master") // Prefix of the corresponding property in application.properteis public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean (name = "ds2") @ConfigurationProperties (Präfix = "Spring.datasource.db2") // Präfix der entsprechenden Eigenschaft in application.Properteis public dataSource dataSource2 () {return DataSourcer.create.create (). Build (); }}Als nächstes müssen Sie zwei MyBatis SQLSessionFactory konfigurieren, um verschiedene Datenquellen zu verwenden:
@Configuration @mapperscan (basepackages = {"titan.mapper"}, sqlSessionFactoryRef = " @Bean public SQLSessionFactory SQLSessionFactory1 () löst eine Ausnahme aus {sqlSessionFactoryBean FactoryBean = new SQLSessionFactoryBean (); factoryBean.setDataSource (DS1); // Verwenden Sie die Titan -Datenquelle, um eine Verbindung zur Titan Library zurückzusetzen. FactoryBean.getObject (); } @Bean public SQLSessionTemplate SQLSessionTemplate1 () löst eine Ausnahme aus {sqlSessionTemplate template = new SQLSessionTemplate (SQLSessionFactory1 ()); // Verwenden Sie die oben konfigurierte Fabrik, um Vorlage zurückzugeben. }}Nach der obigen Konfiguration verwendet die Mapper -Schnittstelle unter titan.mapper die Titan -Datenquelle. In ähnlicher Weise können Sie den zweiten SQLSessionFactory verwenden:
@Configuration @mapperscan (basepackages = {"other.mapper"}, sqlSessionFactoryRef = " @Bean public SQLSessionFactory SQLSessionFactory2 () löst eine Ausnahme aus {sqlSessionFactoryBean FactoryBean = new SQLSessionFactoryBean (); factoryBean.setDataSource (DS2); return factoryBean.getObject (); } @Bean public SQLSessionTemplate SQLSessionTemplate2 () löst eine Ausnahme aus {sqlSessionTemplate template = new SQLSessionTemplate (SQLSessionFactory2 ()); Rückgabevorlage; }}Nehmen wir nach Abschluss dieser Konfigurationen an, dass 2 Mapper Titan.mapper.UserMapper und andere.mapper.rolemapper vorhanden sind. Bei der Verwendung der ersteren wird die Titan -Bibliothek automatisch angeschlossen und letzteres wird mit der DS2 -Bibliothek verbunden.
Dynamische Datenquellen
Die ursprüngliche Absicht, dynamische Datenquellen zu verwenden, besteht darin, das Lesen und Schreiben in der Anwendungsschicht trennen zu können, dh verschiedene Abfragemethoden im Programmcode, um eine Verbindung zu verschiedenen Bibliotheken herzustellen. Zusätzlich zu dieser Methode ist Datenbank Middleware auch eine gute Wahl. Sein Vorteil besteht darin, dass der Datenbankcluster nur einer einzelnen Bibliothek für die Anwendung ausgesetzt ist und die Codelogik der Datenquelle nicht wechseln muss.
Wir erkennen, dass dynamische Datenquellen durch benutzerdefinierte Anmerkungen + AOP wechseln.
Definieren Sie zunächst einen ContexHolder, um den vom aktuellen Thread verwendeten Datenquellennamen zu speichern:
public class DataSourceContextHolder {public static Final Logger log = loggerfactory.getLogger (DataSourceContextHolder.class); / *** Standarddatenquelle*/ public static final String default_ds = "titan-master"; private statische endgültige ThreadLocal <string> contextHolder = new ThreadLocal <> (); // Setzen Sie den Datenquellennamen public static void setDB (String dBType) {log.debug ("zu {} Datenquelle wechseln", dBType); contextHolder.set (DBTYPE); } // den Datenquellennamen public static String getdb () {return (contextHolder.get ()) abrufen; } // den Datenquellennamen öffentlich statische statische void cleardb () {contextHolder.remove (); }}Passen Sie dann die Implementierung der Schnittstelle javax.sql.datasource an. Hier müssen Sie nur die übergeordnete KlassenabstractroutingDataSource erben, die Spring für uns im Voraus implementiert hat:
public class dynamicDataSource erweitert AbstractroutingDataSource {private statische logger logger log = loggerfactory.getLogger (dynamicDataSource.class); @Override Protected Object DeterminecurrentLookupkey () {log.debug ("Datenquelle ist {}", DataSourceContextHolder.getDB ()); return DataSourceContextHolder.getDB (); }}Erstellen Sie dynamische Datenquellen:
/ *** Dynamische Datenquelle: Dynamisches Wechsel zwischen verschiedenen Datenquellen über AOP* @Return*/ @Bean (name = "dynamicds1") public DataSource -DataSource () {dynamicDataSource dynamicDataSource = new DynamicDataSource (); // Standarddatenquelle dynamicDataSource.setDefaultTargetDataSource (DataSource1 ()); // Konfigurieren Sie Multi-Data-Quellkarte <Objekt, Objekt> dsmap = new HashMap (5); dsmap.put ("titan-master", dataSource1 ()); dsmap.put ("ds2", dataSource2 ()); DynamicDataSource.SettargetDataSources (DSMAP); return dynamicdataSource; }Benutzerdefinierte Annotation @Ds wird verwendet, um anzugeben, welche Datenquelle die Methode bei der Codierung verwendet:
@Retention (retentionPolicy.runtime) @target ({elementtype.method}) public @Interface ds {String value () Standard "Titan-master";}Schreiben Sie AOP -Abschnitte, um die Schaltlogik zu implementieren:
@Aspekt@componentpublic class dynamicDataSourceEtPect {@before ("@Annotation (ds)") public void beenSchitchds (joinpoint point) {// Die aktuelle Access -Klasse -Klasse <?> Classname = point.gettarget (). GetClass (); // Erhalten Sie den Zugriffsmethodenname String methodname = point.getSignature (). GetName (); // den Parametertyp der Methodenklasse [] ARGCASS = ((MethodInt) point.getSignature ()). GetParameterTypes (); String dataSource = dataSourceContextHolder.Default_ds; try {// auf das von Methode zugegriffene Methode -Methode = className.getMethod (methodName, argClass); // Bestimmen Sie, ob die @DS -Annotation vorhanden ist, wenn (method.isannotationPresent (ds.class)) {ds Annotation = methode.getannotation (ds.class); // den Datenquellennamen in der Annotation DataSource = Annotation.Value () herausnehmen; }} catch (Ausnahme e) {e.printstacktrace (); } // Die Datenquelle DataSourceContextHolder.setDB (DataSource) wechseln; } @After (" @Annotation (ds)") public void AfterSwitchds (JoinPoint Point) {DataSourceContextHolder.ClearDB (); }}Nach Abschluss der oben genannten Konfiguration werden DynamicDataSource in der vorherigen SQLSessionFactory -Konfiguration angegeben, um DynamicDataSource zu verwenden, um die Datenquellen im Dienst glücklich zu wechseln:
@Autowired private useramodelMapper userAmapper; @Ds ("titan-master") public string ds1 () {return userAmapper.SelectByprimaryKey (1) .getName (); } @Ds ("ds2") public string ds2 () {return userAmapper.SelectByprimaryKey (1) .getName (); }Zusammenfassen
Das obige ist die vom Editor eingeführte Spring Boot + MyBatis Multi-Data-Quelle und dynamische Datenquellenkonfigurationsmethode. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!