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

SpringBoot自定義注解使用讀寫(xiě)分離Mysql數(shù)據(jù)庫(kù)的實(shí)例教程

 更新時(shí)間:2020年11月04日 10:10:45   作者:胖罐子胖摔  
這篇文章主要給大家介紹了關(guān)于SpringBoot自定義注解使用讀寫(xiě)分離Mysql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

需求場(chǎng)景

為了防止代碼中有的SQL慢查詢(xún),影響我們線(xiàn)上主數(shù)據(jù)庫(kù)的性能。我們需要將sql查詢(xún)操作切換到從庫(kù)中進(jìn)行。為了使用方便,將自定義注解的形式使用。

mysql導(dǎo)入的依賴(lài)

		<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.16</version>
  </dependency>

代碼實(shí)現(xiàn)

配置文件

application.yml

spring:
 datasource:
 master:
  username: root
  password: 123456
  jdbc-url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
  driver-class-name: com.mysql.cj.jdbc.Driver
 slave:
  username: root
  password: 123456
  jdbc-url: jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
  driver-class-name: com.mysql.cj.jdbc.Driver

DataSourceType

/**
 * 數(shù)據(jù)源類(lèi)型枚舉
 * @author yangjc01
 * @create 2020/11/02
 */
public enum DataSourceType {
 /**
  * 主庫(kù),主要進(jìn)行寫(xiě)操作
  */
 MASTER,
 /**
  * 從庫(kù),進(jìn)行讀操作
  */
 SLAVE
}

DynamicDataSource

/**
 * 動(dòng)態(tài)數(shù)據(jù)源
 * @author yangjc01
 * @create 2020/11/02
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

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

 @Override
 protected Object determineCurrentLookupKey() {
  return DynamicDataSourceContextHolder.getDateSourceType();
 }
}

DynamicDataSourceContextHolder

public class DynamicDataSourceContextHolder {

 /**
  * 使用ThreadLocal維護(hù)變量,ThreadLocal為每個(gè)使用該變量的線(xiàn)程提供獨(dú)立的變量副本,
  * 所以每一個(gè)線(xiàn)程都可以獨(dú)立地改變自己的副本,而不會(huì)影響其它線(xiàn)程所對(duì)應(yīng)的副本。
  */
 private static final ThreadLocal<String> CONTEXT_HOLDER = 
 new ThreadLocal<>();

 /**
  * 設(shè)置數(shù)據(jù)源的變量
  */
 public static void setDateSourceType(String dsType) {
  CONTEXT_HOLDER.set(dsType);
 }

 /**
  * 獲得數(shù)據(jù)源的變量
  */
 public static String getDateSourceType() {
  return CONTEXT_HOLDER.get();
 }

 /**
  * 清空數(shù)據(jù)源變量
  */
 public static void clearDateSourceType() {
  CONTEXT_HOLDER.remove();
 }
}

DataSource 注解

/**
 * @author yangjc01
 * @create 2020/11/01
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {
 /**
  * 切換數(shù)據(jù)源
  */
 DataSourceType value() default DataSourceType.MASTER;

}

DataSourceAspect 切面

@Aspect
@Order(1)
@Component
public class DataSourceAspect {

 @Pointcut("@annotation(com.jgame.mis.annotation.DataSource)")
 public void dsPointCut() {

 }

 @Around("dsPointCut()")
 public Object around(ProceedingJoinPoint point) throws Throwable {
  MethodSignature signature = (MethodSignature) point.getSignature();

  Method method = signature.getMethod();

  DataSource dataSource = method.getAnnotation(DataSource.class);

  if (null!=dataSource) {
   DynamicDataSourceContextHolder.
   setDateSourceType(dataSource.value().name());
  }

  try {
   return point.proceed();
  } finally {
   // 銷(xiāo)毀數(shù)據(jù)源 在執(zhí)行方法之后
   DynamicDataSourceContextHolder.clearDateSourceType();
  }
 }
}

DataSourceConfig

@Configuration
public class DataSourceConfig {

 @Bean
 @ConfigurationProperties("spring.datasource.master")
 public DataSource masterDataSource() {
  return DataSourceBuilder.create().build();
 }

 @Bean
 @ConfigurationProperties("spring.datasource.slave")
 public DataSource slaveDataSource() {
  return DataSourceBuilder.create().build();
 }

 @Bean(name = "dynamicDataSource")
 @Primary
 public DynamicDataSource dataSource()
 {
  Map<Object, Object> targetDataSources = new HashMap<>();
  targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource());
  targetDataSources.put(DataSourceType.SLAVE.name(), slaveDataSource());
  return new DynamicDataSource(masterDataSource(), targetDataSources);
 }
}

啟動(dòng)類(lèi)上添加注解

@Import({DataSourceConfig.class})
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

需要使用的方法上

@DataSource(value = DataSourceType.SLAVE)

DEMO

	@Select("select * from user")
  @DataSource(value = DataSourceType.SLAVE)
  List<User> selectUserList();

總結(jié)

到此這篇關(guān)于SpringBoot自定義注解使用讀寫(xiě)分離Mysql數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)SpringBoot自定義注解使用讀寫(xiě)分離Mysql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring?Bean的初始化過(guò)程解析

    spring?Bean的初始化過(guò)程解析

    這篇文章主要介紹了spring?Bean的初始化過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • java貪心算法初學(xué)感悟圖解及示例分享

    java貪心算法初學(xué)感悟圖解及示例分享

    這篇文章主要為大家介紹了本人在初學(xué)java貪心算法的感悟,并通過(guò)圖解及示例代碼的方式分享給大家,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • SpringBoot自定義線(xiàn)程池,執(zhí)行定時(shí)任務(wù)方式

    SpringBoot自定義線(xiàn)程池,執(zhí)行定時(shí)任務(wù)方式

    這篇文章主要介紹了SpringBoot自定義線(xiàn)程池,執(zhí)行定時(shí)任務(wù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 關(guān)于SpringCloud的微服務(wù)以及組件詳解

    關(guān)于SpringCloud的微服務(wù)以及組件詳解

    這篇文章主要介紹了關(guān)于SpringCloud的微服務(wù)以及組件詳解,是一個(gè)更高層次的、 架構(gòu)視角的綜合性大型項(xiàng)目, 他的目標(biāo)是構(gòu)建一套標(biāo)準(zhǔn)化的微服務(wù)解決方案,需要的朋友可以參考下
    2023-05-05
  • spring?boot教程之建立第一個(gè)HelloWorld

    spring?boot教程之建立第一個(gè)HelloWorld

    這篇文章主要介紹了spring?boot教程之建立第一個(gè)HelloWorld的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Eclipse Debug模式的開(kāi)啟與關(guān)閉問(wèn)題簡(jiǎn)析

    Eclipse Debug模式的開(kāi)啟與關(guān)閉問(wèn)題簡(jiǎn)析

    這篇文章主要介紹了Eclipse Debug模式的開(kāi)啟與關(guān)閉問(wèn)題簡(jiǎn)析,同時(shí)向大家介紹了一個(gè)簡(jiǎn)單的debug模式啟動(dòng)不起來(lái)的解決方法,希望對(duì)大家有所幫助。
    2017-10-10
  • Jmeter常見(jiàn)函數(shù)使用方法匯總

    Jmeter常見(jiàn)函數(shù)使用方法匯總

    這篇文章主要介紹了Jmeter函數(shù)使用方法匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Maven使用集成測(cè)試的示例代碼

    Maven使用集成測(cè)試的示例代碼

    本文介紹了在Maven項(xiàng)目中使用maven-failsafe-plugin插件進(jìn)行集成測(cè)試,步驟包括添加測(cè)試依賴(lài)、編寫(xiě)集成測(cè)試類(lèi)、配置插件、運(yùn)行測(cè)試以及查看和分析測(cè)試結(jié)果,感興趣的可以了解一下
    2024-11-11
  • springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn)

    springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn)

    Druid是阿里開(kāi)發(fā)的數(shù)據(jù)庫(kù)連接池,本文主要介紹了springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Mybatis如何實(shí)現(xiàn)@Select等注解動(dòng)態(tài)組合SQL語(yǔ)句

    Mybatis如何實(shí)現(xiàn)@Select等注解動(dòng)態(tài)組合SQL語(yǔ)句

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)@Select等注解動(dòng)態(tài)組合SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論

盐山县| 包头市| 泰宁县| 海南省| 磐石市| 澄迈县| 巫溪县| 新田县| 溆浦县| 通城县| 循化| 巴楚县| 马鞍山市| 三亚市| 永春县| 焦作市| 延庆县| 额济纳旗| 清水河县| 靖远县| 略阳县| 鄂托克前旗| 临颍县| 沙河市| 长治县| 南昌县| 瓮安县| 阿城市| 朝阳县| 龙岩市| 富顺县| 无为县| 武山县| 通渭县| 车致| 余江县| 宜昌市| 临邑县| 肃北| 峨边| 汾西县|