中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot中怎么實現多數據源的動態切換

發布時間:2021-07-08 17:09:32 來源:億速云 閱讀:182 作者:Leah 欄目:編程語言

這篇文章給大家介紹springboot中怎么實現多數據源的動態切換,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1、maven依賴

<!--數據庫連接--><dependency>      <groupId>com.oracle</groupId>      <artifactId>ojdbc6</artifactId>      <version>11.2.0.4</version>      <scope>runtime</scope>    </dependency><!--數據庫連接池-><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、多數據源信息配置

#多數據源測試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、數據源配置信息轉換成實體類

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

4、動態數據源切換類

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、多數據源配置類

@Configurationpublic 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"));    //其他參數配置 省略    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"));    //其他參數配置 省略    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@Aspectpublic 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)

@Servicepublic 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);  }}

關于springboot中怎么實現多數據源的動態切換就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北碚区| 互助| 嘉黎县| 盘山县| 荆州市| 湖口县| 南岸区| 临城县| 天柱县| 公主岭市| 千阳县| 响水县| 霍州市| 德兴市| 玛沁县| 林口县| 松阳县| 龙山县| 阳朔县| 昌吉市| 平泉县| 灌云县| 宜兴市| 蒙城县| 盐边县| 化州市| 巴东县| 淮阳县| 永定县| 江都市| 临漳县| 祁连县| 周宁县| 永昌县| 普兰县| 洞口县| 左权县| 富源县| 深泽县| 广丰县| 仁怀市|