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

spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例代碼

 更新時(shí)間:2018年10月30日 15:20:38   作者:擼碼識(shí)途  
這篇文章主要給大家介紹了關(guān)于spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

前幾天有個(gè)需求,需要使用不同的數(shù)據(jù)源,例如某業(yè)務(wù)要用A數(shù)據(jù)源,另一個(gè)業(yè)務(wù)要用B數(shù)據(jù)源。我上網(wǎng)收集了一些資料整合了一下,雖然最后這個(gè)需求不了了之了,但是多數(shù)據(jù)源動(dòng)態(tài)切換還是蠻好用的,所以記錄一下,或許以后有用呢?或者自己感興趣又想玩呢!

下面話不多說了,隨著小編來一起看看詳細(xì)的介紹吧

方法如下:

1.加個(gè)依賴

 <dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>1.3.1</version>
 </dependency>

2.application.properties配置文件

#主從數(shù)據(jù)庫(kù)
master.db.driverClassName=com.mysql.jdbc.Driver
master.db.url=jdbc:mysql://localhost:3306/cbd?characterEncoding=UTF-8&useUnicode=true&useSSL=false
master.db.username=root
master.db.password=admin
slave.db.driverClassName=com.mysql.jdbc.Driver
slave.db.url=jdbc:mysql://localhost:3306/cbd_test?characterEncoding=UTF-8&useUnicode=true&useSSL=false
slave.db.username=root
slave.db.password=admin

mybatis.config-location= classpath:config/mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/**/*.xml

3.禁用springboot默認(rèn)加載數(shù)據(jù)源配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
 
 public static void main(String[] args) throws Exception {
  SpringApplication.run(Application.class, args);
 }
}

4.數(shù)據(jù)源配置類

/**
 * 主數(shù)據(jù)源
 */
@Configuration
@ConfigurationProperties(prefix = "master.db")
public class MasterDataSourceConfig {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}
/**
 * 從數(shù)據(jù)源配置
 */
@Configuration
@ConfigurationProperties(prefix = "slave.db")
public class SlaveDataSourceConfig {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}
/**
 * 數(shù)據(jù)源配置類
 */
@Configuration
public class DataSourceComponent {

 @Resource
 private MasterDataSourceConfig masterDataSourceConfig;

 @Resource
 private SlaveDataSourceConfig slaveDataSourceConfig;


  @Bean(name = "master")
 public DataSource masterDataSource() {
  DataSource dataSource = new DataSource();
  dataSource.setUrl(masterDataSourceConfig.getUrl());
  dataSource.setUsername(masterDataSourceConfig.getUsername());
  dataSource.setPassword(masterDataSourceConfig.getPassword());
  dataSource.setDriverClassName(masterDataSourceConfig.getDriverClassName());
  return dataSource;
 }

 @Bean(name = "slave")
 public DataSource slaveDataSource() {
  DataSource dataSource = new DataSource();
  dataSource.setUrl(slaveDataSourceConfig.getUrl());
  dataSource.setUsername(slaveDataSourceConfig.getUsername());
  dataSource.setPassword(slaveDataSourceConfig.getPassword());
  dataSource.setDriverClassName(slaveDataSourceConfig.getDriverClassName());
  return dataSource;
 }

 @Primary//不加這個(gè)會(huì)報(bào)錯(cuò)。
 @Bean(name = "multiDataSource")
 public MultiRouteDataSource exampleRouteDataSource() {
  MultiRouteDataSource multiDataSource = new MultiRouteDataSource();
  Map<Object, Object> targetDataSources = new HashMap<>();
  targetDataSources.put("master", masterDataSource());
  targetDataSources.put("slave", slaveDataSource());
  multiDataSource.setTargetDataSources(targetDataSources);
  multiDataSource.setDefaultTargetDataSource(masterDataSource());
  return multiDataSource;
 }
}

5.數(shù)據(jù)源上下文

/**
 * 數(shù)據(jù)源上下文
 */
public class DataSourceContext {
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

 public static void setDataSource(String value) {
  contextHolder.set(value);
 }

 public static String getDataSource() {
  return contextHolder.get();
 }

 public static void clearDataSource() {
  contextHolder.remove();
 }
}

6.DataSource路由類

/*
* 重寫的函數(shù)決定了最后選擇的DataSource
*/
public class MultiRouteDataSource extends AbstractRoutingDataSource {

 @Override
 protected Object determineCurrentLookupKey() {
  //通過綁定線程的數(shù)據(jù)源上下文實(shí)現(xiàn)多數(shù)據(jù)源的動(dòng)態(tài)切換,有興趣的可以去查閱資料或源碼
  return DataSourceContext.getDataSource();
 }

}

7.使用,修改上下文中的數(shù)據(jù)源就可以切換自己想要使用的數(shù)據(jù)源了。

 public UserVO findUser(String username) {
  DataSourceContext.setDataSource("slave");
  UserVO userVO = userMapper.findByVO(username);
  System.out.println(userVO.getName()+"=====================");
  return null;
 }

這種是在業(yè)務(wù)中使用代碼設(shè)置數(shù)據(jù)源的方式,也可以使用AOP+注解的方式實(shí)現(xiàn)控制,方法多多!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java scala模式匹配機(jī)制詳解

    Java scala模式匹配機(jī)制詳解

    模式匹配語(yǔ)法中,采用match關(guān)鍵字聲明,每個(gè)分支采用case關(guān)鍵字進(jìn)行聲明,當(dāng)需要匹配時(shí),會(huì)從第一個(gè)case分支開始,如果匹配成功,那么執(zhí)行對(duì)應(yīng)的邏輯代碼,如果匹配不成功,繼續(xù)執(zhí)行下一個(gè)分支進(jìn)行判斷
    2023-02-02
  • IDEA 2020代碼提示忽略大小寫的問題

    IDEA 2020代碼提示忽略大小寫的問題

    這篇文章主要介紹了IDEA 2020代碼提示忽略大小寫的問題,本文通過圖文并茂的形式給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解如何自定義parallelStream線程池

    詳解如何自定義parallelStream線程池

    這篇文章主要為大家介紹了如何自定義parallelStream的線程池實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式

    Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式

    這篇文章主要給大家介紹了關(guān)于Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 詳解SpringBoot如何自定義Starter

    詳解SpringBoot如何自定義Starter

    Starter是Spring Boot中的一個(gè)非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來并對(duì)模塊內(nèi)的Bean根據(jù)環(huán)境( 條件)進(jìn)行自動(dòng)配置。本文將介紹SpringBoot如何自定義Starter,感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • 解決IDEA使用Spring Initializr創(chuàng)建項(xiàng)目時(shí)無法連接到https://start.spring.io的問題

    解決IDEA使用Spring Initializr創(chuàng)建項(xiàng)目時(shí)無法連接到https://start.spring.io的問

    這篇文章主要介紹了解決IDEA使用Spring Initializr創(chuàng)建項(xiàng)目時(shí)無法連接到https://start.spring.io的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中scheduleAtFixedRate的用法

    Java中scheduleAtFixedRate的用法

    如何正確使用Java中的scheduleAtFixedRate是一篇介紹Java中定時(shí)任務(wù)調(diào)度器的文章。它詳細(xì)介紹了scheduleAtFixedRate方法的用法、參數(shù)及作用,并給出了一些實(shí)例以幫助讀者更好地理解其使用。本文為Java開發(fā)人員提供了一些實(shí)用的技巧,幫助他們更好地管理和控制定時(shí)任務(wù)
    2023-04-04
  • Java去除字符串中空格的方法詳解

    Java去除字符串中空格的方法詳解

    這篇文章主要介紹了Java去除字符串中空格的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • spring?aop?pointcut?添加多個(gè)execution方式

    spring?aop?pointcut?添加多個(gè)execution方式

    這篇文章主要介紹了spring?aop?pointcut?添加多個(gè)execution方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Springboot整合第三方登錄功能的實(shí)現(xiàn)示例

    Springboot整合第三方登錄功能的實(shí)現(xiàn)示例

    本文主要介紹了Springboot整合第三方登錄功能的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

唐海县| 和田市| 昌都县| 霍山县| 三穗县| 新化县| 娄底市| 烟台市| 兰考县| 兖州市| 明溪县| 许昌市| 池州市| 铁岭市| 台湾省| 汶川县| 黎川县| 庆安县| 青铜峡市| 农安县| 治多县| 贵州省| 平原县| 湾仔区| 定西市| 余干县| 江达县| 新沂市| 凌云县| 柳林县| 陆丰市| 新昌县| 广丰县| 卢湾区| 军事| 哈尔滨市| 兰西县| 鲁山县| 通海县| 石家庄市| 政和县|