Maison >Java >javaDidacticiel >Comment utiliser Dynamic Datasource pour configurer plusieurs sources de données dans SpringBoot
Caractéristiques fonctionnelles :
Prend en charge le regroupement de sources de données, adapté à une variété de scénarios, lecture et écriture multi-bases de données pures séparation, un maître et plusieurs du mode de fusion.
Prend en charge le démarrage sans source de données et prend en charge la configuration d'une source de données de démarrage paresseux (3.3.2+).
Prend en charge le cryptage des informations de configuration sensibles à la base de données ENC().
Prend en charge l'initialisation indépendante du schéma de structure de table et de la base de données pour chaque base de données.
prend en charge les annotations personnalisées et doit hériter de DS (3.2.0+).
Fournit une intégration rapide pour Druid, Mybatis-Plus, P6sy, Jndi.
Simplifiez la configuration de Druid et HikariCp et fournissez une configuration globale des paramètres. Configurez-le une fois et utilisez-le globalement.
Fournit des solutions de sources de données personnalisées.
fournit une solution pour ajouter et supprimer dynamiquement des sources de données après le démarrage du projet.
Fournit une solution de séparation pure lecture-écriture dans l'environnement Mybatis.
Fournit une méthode pour analyser le schéma de source de données, à l'aide des paramètres dynamiques SpEL. Spel intégré, session, en-tête, personnalisation du support.
Prend en charge la commutation imbriquée de sources de données multicouches. (ServiceA >>> ServiceB >>> ServiceC).
Fournit des solutions, des précautions et des exemples pour l'intégration de bibliothèques tierces telles que shiro, sharding-jdbc, quartz, etc.
Fournit une solution de transaction distribuée basée sur Seata. Pièce jointe : les transactions Spring natives ne sont pas prises en charge.
Fournit des solutions de transactions locales multi-sources de données. Pièce jointe : les transactions Spring natives (3.3.1+) ne sont pas prises en charge.
Notre article met principalement en œuvre la séparation de la lecture et de l'écriture, et un environnement d'un maître et de plusieurs esclaves.
Il est recommandé que la base de données principale effectue uniquement les opérations INSERT, UPDATE et DELETE.
Il est recommandé d'effectuer uniquement des opérations SELECT à partir de la base de données.
1. Préparer la base de données
Base de données principale : PiaoDB
# 🎜 🎜# Depuis la base de données 1 : PiaoDB2 🎜#2. Importez le fichier POM
#🎜 🎜#Présentez Dynamic-datasource-spring-boot-starter.
<!-- 多数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.2</version> </dependency>
3. Editez le fichier de configuration
Nous avons configuré une bibliothèque maître et deux bibliothèques esclaves.
L'"en-tête" de toutes les sources de données séparées par un trait de soulignement _ dans le fichier de configuration est le nom du groupe Sources de données portant le même nom de groupe. sera placé dans un groupe plus bas.
Le nom de la source de données par défaut est master, que nous pouvons modifier via spring.datasource.dynamic.primary.
- Autres adresses d'intégration tierces : Integrated Druid
spring: datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源. datasource: master: url: jdbc:mysql://localhost:3306/PiaoDB?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 slave_1: url: jdbc:mysql://localhost:3306/PiaoDB2?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver slave_2: url: jdbc:mysql://localhost:3306/PiaoDB3?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.DriverParce que nous utilisons Druid, le pool de connexions à la base de données Alibaba, nous devons exclure la classe de configuration rapide de Druid natif.
- En plus de configurer un maître et plusieurs esclaves, nous pouvons également le configurer.
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }Certaines versions de SpringBoot ne peuvent pas être exclues et peuvent être exclues des manières suivantes.
spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure# 多主多从 纯粹多库(记得设置primary) 混合配置 spring: spring: spring: datasource: datasource: datasource: dynamic: dynamic: dynamic: datasource: datasource: datasource: master_1: mysql: master: master_2: oracle: slave_1: slave_1: sqlserver: slave_2: slave_2: postgresql: oracle_1: slave_3: h3: oracle_2:
4. Écrivez le code
Utilisez @DS pour changer de source de données. @DS peut être annoté sur les méthodes et les classes. Si les deux existent, les annotations de méthode ont priorité sur les annotations de classe. Il est fortement recommandé d'annoter la méthode d'implémentation du service ou d'interface du mappeur.@DS("xxx") spécifie la source de données xxx, où xxx peut être un nom de groupe ou le nom d'une bibliothèque spécifique. S'il s'agit d'un nom de groupe, l'algorithme d'équilibrage de charge est utilisé lors de la commutation. Si le nom de groupe ou la bibliothèque spécifié n'existe pas, la source de données par défaut (bibliothèque principale) sera utilisée automatiquement
S'il n'y a pas de @DS, la source de données par défaut (bibliothèque principale) sera utilisée
1. Demande d'ajout d'une nouvelle interface (ajouter des données à la base de données principale) : 127.0.0.1 : 8086/demo /add2. Demande d'interrogation de l'interface de données de la base de données principale : 127.0.0.1:8086/demo/selectMasterGoodsInfo # 🎜🎜#3. Demande d'interface de données esclave (équilibrage de charge) :
- Si @DS est défini mais qu'un groupe ou une bibliothèque n'est pas spécifié, une bibliothèque esclave est sélectionnée en fonction de la stratégie DynamicDataSourceStrategy. Politique d'équilibrage de charge par défaut.
- 2.
1. Contrôleur d'écriture
@RestController @RequiredArgsConstructor @RequestMapping("/demo") public class DemoController { private final DemoService demoService; @GetMapping("/add") public String add() { return demoService.add(null) + ""; } @GetMapping("/selectGoodsInfo") public List<GoodsInfo> selectGoodsInfo(){ return demoService.selectGoodsInfo(); } @GetMapping("/selectMasterGoodsInfo") public List<GoodsInfo> selectMasterGoodsInfo(){ return demoService.selectMasterGoodsInfo(); } } public interface DemoService { boolean add(GoodsInfo param); List<GoodsInfo> selectGoodsInfo(); List<GoodsInfo> selectMasterGoodsInfo(); }@Service @RequiredArgsConstructor public class DemoServiceImpl implements DemoService { private final DemoMapper demoMapper; @DS("master") @Override public boolean add(GoodsInfo param) { param = new GoodsInfo(); param.setGname("1200元秒杀华为Pad"); param.setGnum(100); return demoMapper.insertGoodsInfo(param); } @DS("slave") @Override public List<GoodsInfo> selectGoodsInfo() { return demoMapper.selectGoodsInfo(); } @DS("master") @Override public List<GoodsInfo> selectMasterGoodsInfo() { return demoMapper.selectGoodsInfo(); } }5. Résultats de la vérification
Première demande :
Deuxième demande : #🎜 🎜#
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!