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

spring boot多數(shù)據(jù)源動態(tài)切換代碼實例

 更新時間:2020年01月15日 08:56:57   作者:炫舞風(fēng)中  
這篇文章主要介紹了spring boot多數(shù)據(jù)源動態(tài)切換代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了spring boot多數(shù)據(jù)源動態(tài)切換代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

當(dāng)項目中存在多數(shù)據(jù)源時,就涉及到數(shù)據(jù)源的動態(tài)切換,通過研究,特此記錄一下。

1、maven依賴

<!--數(shù)據(jù)庫連接-->
<dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.4</version>
      <scope>runtime</scope>
    </dependency>
<!--數(shù)據(jù)庫連接池->
<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.10</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
<!--aop->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

2、多數(shù)據(jù)源信息配置

#多數(shù)據(jù)源測試
spring:
 datasource:
  druid:
   master:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    username: test
    password: test
    url: jdbc:oracle:thin:@//ip1:1521/orcl
   slave:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    username: test
    password: test
    url: jdbc:oracle:thin:@//ip2:1521/orcl

3、數(shù)據(jù)源配置信息轉(zhuǎn)換成實體類

@ConfigurationProperties(prefix = "spring.datasource.druid")
@Data
@Component
public class DataSourceProperties {
  private Map<String,String>master;
  private Map<String,String>slave;
}

4、動態(tài)數(shù)據(jù)源切換類

public class DynamicDataSource extends AbstractRoutingDataSource {

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

  public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
    super.setDefaultTargetDataSource(defaultTargetDataSource);
    super.setTargetDataSources(targetDataSources);
    super.afterPropertiesSet();
  }


  @Override
  protected Object determineCurrentLookupKey() {
    return getDataSource();
  }

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

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

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

5、多數(shù)據(jù)源配置類

@Configuration
public class DynamicDataSourceConfig {

  @Bean
  public DataSource master(@Autowired DataSourceProperties dataSourceProperties){
    DruidDataSource druidDataSource = new DruidDataSource();
    Map<String, String> master = dataSourceProperties.getMaster();
    druidDataSource.setUsername(master.get("username"));
    druidDataSource.setPassword(master.get("password"));
    druidDataSource.setUrl(master.get("url"));
    //其他參數(shù)配置 省略
    return druidDataSource;
  }

  @Bean
  public DataSource slave(@Autowired DataSourceProperties dataSourceProperties){
    DruidDataSource druidDataSource = new DruidDataSource();
    Map<String, String> slave = dataSourceProperties.getSlave();
    druidDataSource.setUsername(slave.get("username"));
    druidDataSource.setPassword(slave.get("password"));
    druidDataSource.setUrl(slave.get("url"));
    //其他參數(shù)配置 省略
    return druidDataSource;
  }

  @Bean
  @Primary
  public DynamicDataSource dataSource(DataSource master,DataSource slave){
    Map<Object,Object>map = new HashMap<>(4);
    map.put("master",master);
    map.put("slave",slave);
    return new DynamicDataSource(master,map);
  }
}

6、自定義@DataSource注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {

  String name() default "master";
}

7、Aop切面類配置

@Component
@Aspect
public class DataSourceAspect {

  @Pointcut("@annotation(com.zxgeo.sso.muiltDatasource.anons.DataSource)")
  public void dataSourcePointCut(){}

  @Around(value = "dataSourcePointCut()")
  public Object around(ProceedingJoinPoint point) throws Throwable {
    MethodSignature signature = (MethodSignature) point.getSignature();
    Method method = signature.getMethod();

    DataSource dataSource = method.getAnnotation(DataSource.class);
    if(dataSource == null){
      DynamicDataSource.setDataSource("master");
    }else {
      DynamicDataSource.setDataSource(dataSource.name());
    }
    try {
      return point.proceed();
    } finally {
      DynamicDataSource.clearDataSource();
    }
  }
}

8、啟動配置注解信息,重要(不然運行會報錯)

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})

9、測試

(1)、service層(此處沒有使用mybatis)

@Service
public class TestService {

  @Autowired
  private javax.sql.DataSource dataSource;

  @DataSource
  public Map<String,Object> getMasterDataSource() throws SQLException {
    Connection connection = dataSource.getConnection();
    Map<String,Object> map;
    try (PreparedStatement preparedStatement
           = connection.prepareStatement("SELECT * FROM AA WHERE A=10001")) {
      ResultSet resultSet = preparedStatement.executeQuery();
      map = new HashMap<>();
      while (resultSet.next()){
        map.put("A",resultSet.getString("A"));
        map.put("B",resultSet.getString("B"));
        map.put("C",resultSet.getString("C"));
      }
    }
    return map;
  }
  @DataSource(name = "slave")
  public Map<String,Object> getSlaveDataSource() throws SQLException {
    Connection connection = dataSource.getConnection();
    Map<String,Object> map;
    try (PreparedStatement preparedStatement
           = connection.prepareStatement("SELECT * FROM AA WHERE A=10002")) {
      ResultSet resultSet = preparedStatement.executeQuery();
      map = new HashMap<>();
      while (resultSet.next()){
        map.put("A",resultSet.getString("A"));
        map.put("B",resultSet.getString("B"));
        map.put("C",resultSet.getString("C"));
      }
    }
    return map;
  }
}

(2)、單元測試

@SpringBootTest
@RunWith(SpringRunner.class)
class SsoApplicationTests {

  @Autowired
  private TestService testService;

  @Test
  public void muliDatasorce() throws SQLException {
    Map<String, Object> masterDataSourceUrl = testService.getMasterDataSource();
    System.out.println(masterDataSourceUrl);
    Map<String, Object> slaveDataSourceUrl = testService.getSlaveDataSource();
    System.out.println(slaveDataSourceUrl);
  }
}

(3)、結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 二維碼的生成與解析示例代碼

    java 二維碼的生成與解析示例代碼

    本文主要介紹java二維碼的生成與解析,這里提供示例代碼以便大家參考和理解,希望能幫助開發(fā)Java 二維碼的朋友
    2016-08-08
  • Spring Cloud Zuul路由規(guī)則動態(tài)更新解析

    Spring Cloud Zuul路由規(guī)則動態(tài)更新解析

    這篇文章主要介紹了Spring Cloud Zuul路由規(guī)則動態(tài)更新解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • spring注解@Service注解的使用解析

    spring注解@Service注解的使用解析

    這篇文章主要介紹了spring注解@Service注解的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中兩個List之間的比較方法(差集、交集和并集)

    Java中兩個List之間的比較方法(差集、交集和并集)

    在業(yè)務(wù)的開發(fā)過程中會經(jīng)常用到兩個List集合相互取值的情況,下面這篇文章主要給大家介紹了關(guān)于Java中兩個List之間的比較方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • java實現(xiàn)兩個文件的異或運算

    java實現(xiàn)兩個文件的異或運算

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)兩個文件的異或運算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java實現(xiàn)讀取csv文件的兩種方式

    Java實現(xiàn)讀取csv文件的兩種方式

    這篇文章主要為大家詳細(xì)介紹了如何利用Java讀取csv文件的兩種方式,文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以了解一下
    2023-12-12
  • 求1000階乘的結(jié)果末尾有多少個0

    求1000階乘的結(jié)果末尾有多少個0

    題目是:求1000!的結(jié)果末尾有多少個0,解題思路:兩個素數(shù)2、5,相乘即可得到10,我們可以認(rèn)為,有多少組2、5,結(jié)尾就有多少個0,下面是代碼,需要的朋友可以參考下
    2014-02-02
  • java HashMap詳解及實例代碼

    java HashMap詳解及實例代碼

    這篇文章主要介紹了java HashMap詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 5分鐘搭建SpringCloud Eureka服務(wù)注冊中心的實現(xiàn)

    5分鐘搭建SpringCloud Eureka服務(wù)注冊中心的實現(xiàn)

    這篇文章主要介紹了5分鐘搭建SpringCloud Eureka服務(wù)注冊中心的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring Boot Starter 的應(yīng)用場景與自動配置方式

    Spring Boot Starter 的應(yīng)用場景與自動配置方式

    本文介紹了Spring Boot Starter的使用場景,如何自定義Starter以及Spring Boot自動配置原理,Spring Boot Starter解決了依賴導(dǎo)入和配置繁瑣的問題,通過自動配置類和xxxProperties類實現(xiàn)組件的自動注入和配置,感興趣的朋友一起看看吧
    2025-03-03

最新評論

广汉市| 突泉县| 贵州省| 德化县| 红原县| 青龙| 沾化县| 新和县| 武穴市| 台江县| 河东区| 温泉县| 凯里市| 砚山县| 曲松县| 安仁县| 加查县| 阳西县| 板桥市| 汕头市| 银川市| 尚义县| 浦城县| 疏附县| 汝城县| 丹巴县| 六盘水市| 应城市| 南靖县| 阳新县| 甘肃省| 平果县| 光泽县| 高密市| 桦甸市| 霍城县| 扶余县| 聂拉木县| 周宁县| 保山市| 庆元县|