成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解鎖無限可能:使用SpringBoot和MyBatis打造動態數據源

數據庫 其他數據庫
今天分享一個 利用SpringBoot和Mybatis實現動態加載數據源的過程,可以達到服務不停機遷移數據源的目的。

今天分享一個利用SpringBoot和Mybatis實現動態加載數據源的過程,可以達到服務不停機遷移數據源的目的,廢話不多說直接上代碼。

首先 你需要在application.properties或application.yml文件中配置一個數據源的連接信息-用于存儲配置信息,類似于以下示例:
# 主數據源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test_test 
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
接下來,創建一個DataSourceDynamicConfig類來配置多個數據源
@Configuration
@ConditionalOnClass(value = {DataSource.class})
public class DataSourceDynamicConfig {

    String DEFAULT = "default";



    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean("defaultDataSource")
    public DataSource setDefault(){
        return DataSourceBuilder.create()
                .type(DruidDataSource.class).build();
    }

    @Bean
    public DynamicDataSource dynamicDataSource(@Qualifier("defaultDataSource") DataSource defaultDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DEFAULT, defaultDataSource);


        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setDataSources(targetDataSources);
        dataSource.setDefaultTargetDataSource(defaultDataSource);
        DataSourceContextHolder.setDataSourceName(DEFAULT);
        return dataSource;
    }


    @Bean
    public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

在上述代碼中,我們使用@ConfigurationProperties注解將不同數據源的配置注入到DataSource實例中。然后,我們創建一個DynamicDataSource實例。我們使用targetDataSources屬性來存儲所有數據源,每個數據源都有一個標識符。defaultTargetDataSource屬性指定默認的數據源。

接下來,我們需要創建一個DynamicDataSource類來實現動態切換數據源。以下是一個簡化的示例:
public class DynamicDataSource extends AbstractRoutingDataSource {

	// 存儲所有數據源
    private static Map<Object, Object> dataSources = new HashMap<>();


    public void setDataSources(Map<Object, Object> sources){
        this.setTargetDataSources(sources);
        dataSources = sources;
    }

	
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceName();
    }


	// 動態添加數據源
    public static void setDataSource(String key,DataSource dataSource){
        dataSources.putIfAbsent(key,dataSource);
    }

    protected DataSource determineTargetDataSource() {
        String dataSourceName = determineCurrentLookupKey().toString();
        DataSource dataSource = (DataSource) dataSources.get(dataSourceName);
        if (dataSource == null) {
            throw new IllegalStateException("DataSource '" + dataSourceName + "' is not configured");
        }
        return dataSource;
    }

}
//存儲當前線程數據源
public class DataSourceContextHolder {

    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    public static void setDataSourceName(String name){
        CONTEXT_HOLDER.set(name);
    }

    public static String getDataSourceName(){
        return CONTEXT_HOLDER.get();
    }

    public static void clearDataSourceName(){
        CONTEXT_HOLDER.remove();
    }

}
添加一個數據實體,用于接收動態數據源。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DataSourceEntity {

    String url;

    String userName;

    String pwd;

    String driverClassName;
}
接下來構造點模擬數據。

準備數據測試數據表語句。

create database test_test;
CREATE TABLE `t_t` (
  `id` int DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='test'

插入兩個數據庫測試數據。

## test_test
INSERT INTO test_test.t_t
(id, name)
VALUES(1, 'test_test');
## full_dev
INSERT INTO test_test.t_t
(id, name)
VALUES(1, 'full_dev');

創建一個查詢TestMapper類。

@Mapper
public interface TestMapper {


    @Select("select * from t_t")
    Map<String,Object> selectMap();
}

創建SpringBoot Main函數。

@SpringBootApplication
@MapperScan(basePackages = {"com.xlc.common.datasource.mapper.test"})
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class,args);
    }
}
最后 單元測試。
@SpringBootTest(classes = Main.class)
@RunWith(SpringRunner.class)
public class TestApp {

    String userName = "root";

    String pwd = "root";

    String url = "jdbc:mysql://192.168.15.130:32691/test_test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false";

    String driver = "com.mysql.cj.jdbc.Driver";


    @Resource
    TestMapper testMapper;


    @Before
    public void before(){
      DataSource dataSource =  DataSourceBuilder.create()
                .url(url)
                .username(userName)
                .password(pwd)
                .driverClassName(driver)
                .build();
        DynamicDataSource.setDataSource("hhh",dataSource);

    }

    @Test
    public void t2(){
        System.out.println(JSONUtil.toJsonStr(testMapper.selectMap()));
        DataSourceContextHolder.setDataSourceName("hhh");
        System.out.println(JSONUtil.toJsonStr(testMapper.selectMap()));

    }
}

運行結果:

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-01-04 09:33:31

SpringBootMybatis

2023-06-07 08:08:37

MybatisSpringBoot

2024-09-05 15:48:21

2024-01-10 08:14:10

Java反射工具

2024-10-30 10:22:17

2020-12-31 07:55:33

spring bootMybatis數據庫

2025-01-09 11:21:25

2023-09-07 08:39:39

copy屬性數據源

2024-03-18 08:33:16

2023-12-13 12:20:36

SpringMySQL數據源

2024-05-20 00:00:00

2014-11-20 09:47:06

Java

2020-06-02 07:55:31

SpringBoot多數據源

2021-03-10 19:01:02

SQL數據源

2024-11-01 10:34:45

2009-06-15 13:24:46

JBoss數據源

2010-12-27 09:59:11

ODBC數據源

2015-12-25 16:37:02

RxJava數據源數據

2022-05-10 10:43:35

數據源動態切換Spring
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲网站 | www.久久 | 国产一级毛片视频 | 国产综合视频 | 久久一| 久久这里只有精品首页 | 国产精品久久国产精品 | 特黄毛片| 国产综合视频 | 亚洲性综合网 | 国产91久久久久蜜臀青青天草二 | 丁香婷婷综合激情五月色 | 久久综合香蕉 | 成人精品一区二区三区 | 日韩中文字幕在线观看 | www.日日夜夜 | 国产精品一区二区久久精品爱微奶 | 亚洲一区二区免费电影 | 91资源在线 | 国产精品久久久久久久久免费高清 | 99久久久久久 | 国产精品视频免费看 | 国产欧美精品一区二区三区 | 久久天堂网| 日韩欧美二区 | 男人天堂网av | 久久99这里只有精品 | 精品网站999 | 国产毛片av | 国产一区二区精品在线 | 亚洲国产成人精品女人久久久 | 国产精品黄色 | 午夜激情免费视频 | 国产精品久久久久久久粉嫩 | 日本一区二区不卡视频 | 成人三级视频 | 欧美一区二区视频 | 欧美精品三区 | 国产毛片久久久 | 91精品国产综合久久婷婷香蕉 | 亚洲一区中文 |