Fondamentalement, les articles sur Internet ne disposent que de plusieurs sources de données ou seulement des sources de données dynamiques, tandis que les projets récents doivent utiliser deux méthodes en même temps. Enregistrons les méthodes de configuration pour votre référence.
Scénarios d'application
Le projet doit connecter deux bases de données différentes A et B en même temps, et ce sont des architectures maître-esclaves, une bibliothèque d'écriture et plusieurs bibliothèques en lecture.
Plusieurs sources de données
Tout d'abord, vous devez désactiver le DataSourCeAutoConfiguration qui est livré avec Spring Boot, car il lira le Spring.datasource. * Propriété du fichier application.properties et configurer automatiquement une seule source de données. Ajoutez simplement l'attribut excluant à l'annotation @springbootapplication:
@SpringBootApplication (exclude = {dataSourceAutoConfiguration.class}) classe publique TitanWebApplication {public static void main (String [] args) {SpringApplication.run (titanwebapplication.class, args); }}Configurez ensuite les informations de connexion source multi-données dans Application.Properties:
# bibliothèque Titan printemps.datasource.titan-master.url = jdbc: mysql: // xxxx: port / titan? CharacterEncoding = utf-8spring.datasource.titan-master.u sername = printemps.datasource.titan-master.password = printemps.datasource.titan-master.driver-class-name = com.mysql.jdbc.driver # Configuration du pool de connexion # omettre # autres bibliothèques printemps.datasource.db2.url = jdbc: mysql: // xxxx: port / titan2? CharacterEncoding = utf-8spring.datasource.db2.username = printemps.datasource.db2.password = printemps.datasource.db2.driver-class-same = com.mysql.jdbc.db.Driver
Étant donné que nous avons désactivé la configuration automatique des sources de données, nous devons créer manuellement ces sources de données à l'étape suivante:
@ConfigurationPublic Class DataSourCeConfig {@Bean (name = "Titanmasterds") @configurationProperties (prefix = "Spring.Datasource.titan-Master") // Prefix de la propriété correspondante dans Application.Properteis Public DataSource DataSource1 () {return datasourceBuBuilder.create ().);); } @Bean (name = "ds2") @configurationproperties (prefix = "printemps.datasource.db2") // préfixe de la propriété correspondante dans application.properteis public datasource dataSource2 () {return dataSourceBuilder.create (). Build (); }}Ensuite, vous devez configurer deux MyBatis SQLSessionFactory pour utiliser différentes sources de données:
@ Configuration @ MAPPERSCAN (BASEPACKAGES = {"Titan.mapper"}, SqlSessionFactoryRef = "SqlSessionFactory1") classe publique MyBatisdBaconFig {@Autowired @qualifier ("TitanMasterds") Private DataSource DS1; @Bean Public SqlSessionFactory SqlSessionFactory1 () lève une exception {SQLSessionFactoryBean FactoryBean = new SqlSessionFactoryBean (); FactoryBean.SetDataSource (DS1); // Utilisez la source de données Titan pour se connecter à la bibliothèque Titan Return factoryBean.getObject (); } @Bean public sqlSessionTemplate sqlSessionTemplate1 () lève une exception {sqlSessionTemplate template = new sqlSessionTemplate (sqlSessionFactory1 ()); // Utilisez l'usine configurée ci-dessus pour retourner le modèle; }}Après la configuration ci-dessus, l'interface de mappeur sous Titan.mapper utilisera la source de données Titan. De même, vous pouvez utiliser le deuxième SQLSessionFactory:
@ Configuration @ MAPPERSCAN (BASEPACKAGES = {"Autre.mapper"}, sqlSessionFactoryRef = "SqlSessionFactory2") classe publique MyBatisDBBConfig {@Autowired @qualifier ("DS2") private DataSource DS2; @Bean public SqlSessionFactory SqlSessionFactory2 () lève une exception {SQLSessionFactoryBean FactoryBean = new SqlSessionFactoryBean (); FactoryBean.SetDataSource (DS2); return factorybean.getObject (); } @Bean public sqlSessionTemplate SQLSessionTemplate2 () lève une exception {sqlSessionTemplate template = new SQLSessionTemplate (sqlSessionFactory2 ()); modèle de retour; }}Après avoir terminé ces configurations, supposons qu'il y ait 2 mappeurs Titan.mapper.UserMapper et autres.mapper.rolemapper. Lorsque vous utilisez le premier, la bibliothèque Titan sera automatiquement connectée et ce dernier sera connecté à la bibliothèque DS2.
Sources de données dynamiques
L'intention d'origine d'utiliser des sources de données dynamiques est de pouvoir séparer la lecture et l'écriture sur la couche d'application, c'est-à-dire pour contrôler différentes méthodes de requête dans le code du programme pour se connecter à différentes bibliothèques. En plus de cette méthode, le middleware de la base de données est également un bon choix. Son avantage est que le cluster de base de données n'est exposé qu'à une seule bibliothèque pour l'application et n'a pas besoin de changer la logique de code de la source de données.
Nous réalisons que la source de données dynamique commutation à travers des annotations personnalisées + AOP.
Définissez d'abord un contextholder pour enregistrer le nom de la source de données utilisé par le thread actuel:
classe publique DataSourceContexTholder {public static final logger log = loggerfactory.getLogger (dataSourContexTholder.class); / ** * Source de données par défaut * / public static final String default_ds = "titan-master"; Final Final statique privé <string> ContexTholder = new ThreadLocal <> (); // Définissez le nom de source de données public static void setDB (String dbType) {log.debug ("Passer à {} Source de données", dbType); ContexTholder.set (dbType); } // Obtenez le nom de la source de données public static String getDB () {return (ContexTholder.get ()); } // effacer le nom de la source de données public static void cleardb () {ContexTholder.Remove (); }}Personnalisez ensuite l'implémentation de l'interface javax.sql.datasource. Ici, il vous suffit de hériter de la classe parent abstractroutingdatasource que le printemps a mis en œuvre pour nous à l'avance:
La classe publique DynamicDataSource étend AbstratTroutingDataSource {private static final logger log = loggerfactory.getLogger (dynamicDataSource.class); @Override Protected Object DetermentCurrentLookUpkey () {log.debug ("La source de données est {}", DataSourCeContexTholder.getDB ()); return dataSourceContexTholder.getDb (); }}Créer des sources de données dynamiques:
/ ** * Source de données dynamique: commutation dynamique entre différentes sources de données via AOP * @return * / @bean (name = "dynamicds1") public dataSource dataSource () {dynamicDataSource dynamicDataSource = new DynamicDataSource (); // la source de données par défaut DynamicDataSource.setDefaultTargetDataSource (DataSource1 ()); // Configurer la carte source multi-données <objet, objet> dsmap = new hashmap (5); dsmap.put ("titan-master", dataSource1 ()); dsmap.put ("ds2", dataSource2 ()); dynamicDataSource.setTargetDataSources (dsmap); return dynamicDataSource; }Annotation @DS personnalisée est utilisée pour spécifier quelle source de données utilise la méthode lors du codage:
@Retention (RetentionPolicy.Runtime) @target ({elementType.Method}) public @Interface DS {String Value () par défaut "Titan-Master";}Écrivez des sections AOP pour implémenter la logique de commutation:
@ Aspect @ composantpublic class dynamicDataSourCeaSpect {@Before ("@ annotation (ds)") public void beforeswitchds (joinpoint point) {// Obtenez la classe d'accès actuelle classe <?> Classname = point.gettarget (). GetClass (); // Obtenez la méthode d'accès Nom String MethodName = Point.getSignature (). GetName (); // Obtenez le type de paramètre de la classe de méthode [] argclass = ((Methodsignature) Point.getSignature ()). GetParAmEterTypes (); String dataSource = DataSourCeContexTholder.default_ds; essayez {// l'objet méthode accessible est méthode méthode = className.getMethod (méthodyName, argClass); // Déterminez si l'annotation @DS existe if (méthode.isannotationPresent (ds.class)) {ds annotation = method.getAnTannotation (ds.class); // supprime le nom de la source de données dans l'annotation dataSource = annotation.value (); }} catch (exception e) {e.printStackTrace (); } // Communiquez la source de données DataSourCeContexTholder.SetDB (DataSource); } @After ("@ annotation (ds)") public void AfterSwitchds (point joinpoint) {dataSourConTexTholder.CleardB (); }}Après avoir terminé la configuration ci-dessus, spécifiant DynamicDataSource dans la configuration SQLSessionFactory précédente pour utiliser DynamicDataSource pour changer avec plaisir de sources de données dans le service:
@Autowired privé userAmodelMapper userAmapper; @Ds ("titan-master") public String ds1 () {return userAmapper.SelectByprimaryKey (1) .getName (); } @Ds ("ds2") String public ds2 () {return userAmapper.SelectByprimaryKey (1) .getName (); }Résumer
Ce qui précède est la source Spring Boot + MyBatis Multi-Data et la méthode de configuration de la source de données dynamique qui vous est présentée par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!