最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot采用Dynamic-Datasource方式實現(xiàn)多JDBC數(shù)據(jù)源

 更新時間:2023年10月09日 15:27:29   作者:Bulut0907  
在某些情況下,如果我們需要配置多個數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下

1.1 特性

  • 提供本地多數(shù)據(jù)源事務方案。由AOP實現(xiàn)
  • 支持數(shù)據(jù)源分組,適用于多種場景,如多庫讀寫分離、一主多從(實現(xiàn)了數(shù)據(jù)庫負載均衡算法)、混合模式
  • 提供自定義數(shù)據(jù)源來源方案(如全從數(shù)據(jù)庫加載)
  • 提供項目啟動后動態(tài)增加移除數(shù)據(jù)源方案
  • 支持數(shù)據(jù)庫敏感配置信息加密(可自定義)ENC()
  • 支持每個數(shù)據(jù)庫獨立初始化表結構schema和數(shù)據(jù)庫database
  • 支持無數(shù)據(jù)源啟動,支持懶加載數(shù)據(jù)源(需要的時候再創(chuàng)建連接)
  • 支持自定義注解,需繼承DS(3.2.0+)
  • 提供并簡化對Druid、HikariCp、BeeCp、Dbcp2的快速集成
  • 提供對Mybatis-Plus、Quartz、ShardingJdbc、P6sy、Jndi等組件的集成方案
  • 提供Mybatis環(huán)境下的純讀寫分離方案
  • 提供使用spel動態(tài)參數(shù)解析數(shù)據(jù)源方案。內(nèi)置spel、session、header,支持自定義
  • 支持多層數(shù)據(jù)源嵌套切換。(ServiceA >>> ServiceB >>> ServiceC)
  • 支持Seata分布式事務

1.2 Mysql數(shù)據(jù)準備

分別創(chuàng)建read_db.user和write_db.user,并向read_db.user寫入數(shù)據(jù)

mysql> create database read_db;
Query OK, 1 row affected (0.14 sec)
mysql> create database write_db;
Query OK, 1 row affected (0.01 sec)
mysql> create table read_db.user (
    -> id bigint(20) auto_increment not null comment '主鍵ID',
    -> name varchar(30) null default null comment '姓名',
    -> primary key (id)
    -> );
Query OK, 0 rows affected, 1 warning (0.29 sec)
mysql> 
mysql> insert into read_db.user (id, name) values
    -> (1, 'read_name1'),
    -> (2, 'read_name2'),
    -> (3, 'read_name3'),
    -> (4, 'read_name4'),
    -> (5, 'read_name5');
Query OK, 5 rows affected (0.16 sec)
Records: 5  Duplicates: 0  Warnings: 0
mysql> 
mysql> create table write_db.user (
    -> id bigint(20) auto_increment not null comment '主鍵ID',
    -> name varchar(30) null default null comment '姓名',
    -> primary key (id)
    -> );
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> 

2.2 通過Dynamic-Datasource實現(xiàn)多JDBC數(shù)據(jù)源

2.2.1 pom.xml依賴

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

可以看到自動添加了spring-boot-starter-jdbc、spring-boot-starter-aop依賴

dynamic-datasource-spring-boot-starter

2.2.2 application.properties配置

通過dynamic方式,指定了datasource1和datasource2兩個DataSource

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 設置默認的數(shù)據(jù)源。默認是master
spring.datasource.dynamic.primary=datasource1
# 嚴格匹配數(shù)據(jù)源, 默認false。true表示未匹配到指定數(shù)據(jù)源時拋異常, false表示使用默認數(shù)據(jù)源
spring.datasource.dynamic.strict=true
# 用于讀的數(shù)據(jù)庫
spring.datasource.dynamic.datasource.datasource1.url=jdbc:mysql://192.168.28.12:3306/read_db
spring.datasource.dynamic.datasource.datasource1.username=root
spring.datasource.dynamic.datasource.datasource1.password=Root_123
spring.datasource.dynamic.datasource.datasource1.driver-class-name=com.mysql.cj.jdbc.Driver
# 用于寫的數(shù)據(jù)庫
spring.datasource.dynamic.datasource.datasource2.url=jdbc:mysql://192.168.28.12:3306/write_db
spring.datasource.dynamic.datasource.datasource2.username=root
spring.datasource.dynamic.datasource.datasource2.password=Root_123
spring.datasource.dynamic.datasource.datasource2.driver-class-name=com.mysql.cj.jdbc.Driver

2.2.3 使用@DS注解選擇DataSource

可以在Service的類或方法上(優(yōu)先級更高)使用@DS注解選擇DataSource

2.2.4 使用@Transactional + @DSTransactional實現(xiàn)事務

可以在Service的類或方法上(優(yōu)先級更高)使用@Transactional實現(xiàn)事務。對異常的捕獲后,通過 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 進行手動回滾

@Transactional注解會讓@DS的多數(shù)據(jù)源切換失效,雖然可以通過 @Transactional(propagation = Propagation.REQUIRES_NEW) 開啟一個內(nèi)部子事務來使@DS切換數(shù)據(jù)源,但是大部分場景不適用

@DSTransactional能和@DS多數(shù)據(jù)源切換配合使用,@DSTransactional注解最好使用在方法上(類似好像不生效),@DSTransactional注解不能對異常進行捕獲手動回滾,只能自動回滾然后拋出異常

2.3 動態(tài)數(shù)據(jù)源測試

2.3.1 創(chuàng)建User類

package com.hh.springboottest.myController;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class User {
    private Long id;
    private String name;
}

2.3.2 Mapper接口實現(xiàn)

package com.hh.springboottest.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hh.springboottest.myController.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.3.3 Service實現(xiàn)

Service接口實現(xiàn)

package com.hh.springboottest.service;
import com.hh.springboottest.myController.User;
public interface UserService {
    public User getUser(Long id);
    public void saveMultiUser();
}

ServiceImpl實現(xiàn)類。說明如下:

  • @DS(“datasource1”)注解,讓userMapper.selectById使用了datasource1數(shù)據(jù)源
  • @DS(“datasource2”)注解,讓userMapper.insert使用了datasource2數(shù)據(jù)源
  • @Transactional注解,當userMapper.insert(user1)執(zhí)行成功,userMapper.insert(user2)執(zhí)行失敗,會回滾userMapper.insert(user1)的操作
package com.hh.springboottest.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.hh.springboottest.mapper.UserMapper;
import com.hh.springboottest.myController.User;
import com.hh.springboottest.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;
    @DS("datasource1")
    @Override
    public User getUser(Long id) {
        return userMapper.selectById(id);
    }
    @Transactional
    @DS("datasource2")
    @Override
    public void saveMultiUser() {
        User user2 = new User(2L, "write_name2");
        userMapper.insert(user2);
        User user3 = new User(3L, "write_name3");
        userMapper.insert(user3);
    }
}

2.3.4 測試

package com.hh.springboottest;
import com.hh.springboottest.myController.User;
import com.hh.springboottest.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@Slf4j
@SpringBootTest
public class MyApplicationTest {
    @Autowired
    UserService userService;
    @Test
    public void dynamicDataSourceTest() {
        User user = userService.getUser(1L);
        log.info("獲取到的用戶為:{}", user);
        userService.saveMultiUser();
    }
}

運行程序,結果如下:

2022-11-24 09:16:15.733  INFO 33760 --- [           main] com.hh.springboottest.MyApplicationTest  : 獲取到的用戶為:User(id=1, name=read_name1)
2022-11-24 09:16:15.857  INFO 33760 --- [ionShutdownHook] c.b.d.d.DynamicRoutingDataSource         : dynamic-datasource start closing ....
2022-11-24 09:16:15.861  INFO 33760 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
2022-11-24 09:16:15.866  INFO 33760 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
2022-11-24 09:16:15.866  INFO 33760 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-2} closing ...
2022-11-24 09:16:15.867  INFO 33760 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-2} closed
2022-11-24 09:16:15.867  INFO 33760 --- [ionShutdownHook] c.b.d.d.DynamicRoutingDataSource         : dynamic-datasource all closed success,bye

同時查看write_db.user表,數(shù)據(jù)如下:

mysql> select * from write_db.user;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | write_name1  |
|  2 | write_name2  |
|  3 | write_name3  |
+----+--------------+
3 rows in set (0.11 sec)
mysql> 

2.4 removeDataSource刪除DataSource

通過DynamicRoutingDataSource的removeDataSource方法刪除DataSource

package com.hh.springboottest.service.impl;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
@Service
public class DataSourceServiceImpl implements DataSourceService {
    @Autowired
    DataSource dataSource;
    public void removeDataSource(String dataSourceName) {
        DynamicRoutingDataSource dynamicRoutingDataSource =
                (DynamicRoutingDataSource) dataSource;
        dynamicRoutingDataSource.removeDataSource(dataSourceName);
    }
}

到此這篇關于SpringBoot采用Dynamic-Datasource方式實現(xiàn)多JDBC數(shù)據(jù)源的文章就介紹到這了,更多相關SpringBoot Dynamic-Datasource JDBC數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Java抽象類與接口區(qū)別詳解

    Java抽象類與接口區(qū)別詳解

    這篇文章主要介紹了Java抽象類與接口區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java?GenericObjectPool?對象池化技術之SpringBoot?sftp?連接池工具類詳解

    Java?GenericObjectPool?對象池化技術之SpringBoot?sftp?連接池工具類詳解

    這篇文章主要介紹了Java?GenericObjectPool?對象池化技術之SpringBoot?sftp?連接池工具類詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能

    SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能

    這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能的實現(xiàn)過程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse2016是一款全球使用最為廣泛的企業(yè)級開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Java System類兩個常用方法代碼實例

    Java System類兩個常用方法代碼實例

    這篇文章主要介紹了Java System類兩個常用方法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • java關鍵字static的使用詳解

    java關鍵字static的使用詳解

    這篇文章主要介紹了java關鍵字static的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 一篇文章徹底解決IDEA輸出中文亂碼問題

    一篇文章徹底解決IDEA輸出中文亂碼問題

    IDEA輸出中文是亂碼的問題,網(wǎng)上教程很多,很復雜,作者測試了很多種辦法,現(xiàn)在將總結的方法提供給大家,下面這篇文章主要給大家介紹了關于徹底解決IDEA輸出中文亂碼問題的相關資料,需要的朋友可以參考下
    2023-05-05
  • 存儲過程創(chuàng)建及springboot代碼調用存儲過程方式

    存儲過程創(chuàng)建及springboot代碼調用存儲過程方式

    文章介紹了如何在Navicat中創(chuàng)建存儲過程,并在Spring Boot項目中調用存儲過程,存儲過程創(chuàng)建步驟包括選擇函數(shù)類型、自定義函數(shù)名、添加參數(shù)等,在Spring Boot中調用存儲過程時,可以通過JdbcTemplate或MyBatis等工具進行
    2024-11-11
  • SpringBoot自動裝配之@Import深入講解

    SpringBoot自動裝配之@Import深入講解

    由于最近的項目需求,需要在把配置類導入到容器中,通過查詢,使用@Import注解就能實現(xiàn)這個功能,@Import注解能夠幫我們吧普通配置類(定義為Bean的類)導入到IOC容器中
    2023-01-01
  • feign GET請求不支持對象傳參的坑及解決

    feign GET請求不支持對象傳參的坑及解決

    這篇文章主要介紹了feign GET請求不支持對象傳參的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

南溪县| 布尔津县| 延寿县| 民丰县| 昌平区| 新平| 阿合奇县| 临泽县| 梨树县| 蒙山县| 吉林市| 浏阳市| 瓮安县| 武义县| 增城市| 香格里拉县| 宜兰市| 恩平市| 阆中市| 兴文县| 秭归县| 安龙县| 湄潭县| 普定县| 咸宁市| 平遥县| 衡阳市| 高阳县| 山阳县| 涪陵区| 广宗县| 肇庆市| 泸定县| 隆子县| 鹤岗市| 肃宁县| 天津市| 和平区| 错那县| 阜平县| 方城县|