日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

帶你了解mybatis如何實現讀寫分離

瀏覽:29日期:2023-10-18 13:13:30
目錄1、spring aop實現2、mybatis-plus的實現方式總結1、spring aop實現

首先application-test.yml增加如下數據源的配置

spring: datasource: master: jdbc-url: jdbc:mysql://master域名:3306/test username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave1: jdbc-url: jdbc:mysql://slave域名:3306/test username: root # 只讀賬戶 password: 123456 driver-class-name: com.mysql.jdbc.Driver slave2: jdbc-url: jdbc:mysql://slave域名:3306/test username: root # 只讀賬戶 password: 123456 driver-class-name: com.mysql.jdbc.Driver

package com.cjs.example.enums;public enum DBTypeEnum { MASTER, SLAVE1, SLAVE2;}

定義ThreadLocal上下文,將當前線程的數據源進行動態修改

public class DBContextHolder { private static volatile ThreadLocal<DBTypeEnum> contextHolder = new ThreadLocal<>(); public static synchronized void set(DBTypeEnum dbType) {contextHolder.set(dbType); } public static synchronized DBTypeEnum get() {return contextHolder.get(); } public static void master() {set(DBTypeEnum.MASTER); } public static void slave() {set(DBTypeEnum.SLAVE1); } public static void slave2(){ set(DBTypeEnum.SLAVE2); } // 清除數據源名 public static void clearDB() {contextHolder.remove(); }}

重寫mybatis數據源路由接口,在此修改數據源為我們上一塊代碼設置的上下文的數據源

public class MyRoutingDataSource extends AbstractRoutingDataSource { @Nullable @Override protected Object determineCurrentLookupKey() {DBTypeEnum dbTypeEnum=DBContextHolder.get();return dbTypeEnum; }}

將yml配置的多數據源手動指定注入

@Configurationpublic class DataSourceConfig { @Bean @ConfigurationProperties('spring.datasource.master') public DataSource masterDataSource() {return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties('spring.datasource.slave1') public DataSource slave1DataSource() {return DataSourceBuilder.create().build(); } @Bean public DataSource myRoutingDataSource(@Qualifier('masterDataSource') DataSource masterDataSource, @Qualifier('slave1DataSource') DataSource slave1DataSource) {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);myRoutingDataSource.setTargetDataSources(targetDataSources);return myRoutingDataSource; }}

sqlsession注入以上我們配置的datasource路由

@EnableTransactionManagement@Configuration@Import({TableSegInterceptor.class})public class MyBatisConfig { @Resource(name = 'myRoutingDataSource') private DataSource myRoutingDataSource; @Autowired private MybatisConfigProperty mybatisConfigProperty; @Autowired private TableSegInterceptor tableSegInterceptor; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(myRoutingDataSource);// SpringBoot項目集成mybatis打包為jar運行時setTypeAliasesPackage無效解決VFS.addImplClass(SpringBootVFS.class);sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mybatisConfigProperty.getMapperLocations()));sqlSessionFactoryBean.setTypeAliasesPackage(mybatisConfigProperty.getTypeAliasesPackage());sqlSessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(mybatisConfigProperty.getConfigLocation()));sqlSessionFactoryBean.setPlugins(new Interceptor[]{tableSegInterceptor});return sqlSessionFactoryBean.getObject(); } @Bean public PlatformTransactionManager platformTransactionManager() {return new DataSourceTransactionManager(myRoutingDataSource); }}

spring aop攔截指定前綴的service方法,并設置對應所屬的上下文

@Aspect@Componentpublic class DataSourceAop { @Pointcut('!@annotation(com.ask.student.interceptor.annotation.Master) ' + '&& (execution(* com.ask.student.service..*.select*(..)) ' + '|| execution(* com.ask.student.service..*.get*(..))' + '|| execution(* com.ask.student.service..*.find*(..))' + ')') public void readPointcut() { } @Pointcut('@annotation(com.ask.student.interceptor.annotation.Master) ' + '|| execution(* com.ask.student.service..*.insert*(..)) ' + '|| execution(* com.ask.student.service..*.clean*(..)) ' + '|| execution(* com.ask.student.service..*.reset*(..)) ' + '|| execution(* com.ask.student.service..*.add*(..)) ' + '|| execution(* com.ask.student.service..*.update*(..)) ' + '|| execution(* com.ask.student.service..*.edit*(..)) ' + '|| execution(* com.ask.student.service..*.delete*(..)) ' + '|| execution(* com.ask.student.service..*.remove*(..))') public void writePointcut() { } @Before('readPointcut()') public void read() {DBContextHolder.slave(); } @Before('writePointcut()') public void write() {DBContextHolder.master(); } @After('readPointcut()||writePointcut()') public void afterSwitchDS(){DBContextHolder.clearDB(); }}

以上最后一個方法的作用,在攔截器中獲取后及時清除避免導致來回切換當前線程變量延遲問題導致某些操作的數據源錯誤

DBContextHolder.clearDB();

@After('readPointcut()||writePointcut()')

public void afterSwitchDS(){

DBContextHolder.clearDB();

}

2、mybatis-plus的實現方式

這個方式配置簡單,代碼少,很多事情mybatis-plus都已經做好了,推薦使用

yml配置如下

datasource: dynamic: primary: master #設置默認的數據源或者數據源組,默認值即為master strict: false #設置嚴格模式,默認false不啟動. 啟動后在未匹配到指定數據源時候會拋出異常,不啟動則使用默認數據源. datasource:master: url: jdbc:mysql://xxx:3306/db0?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: admin password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 pool-name: springHikariCP max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1slave1: url: jdbc:mysql://xxx:3306/db2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: admin password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 pool-name: springHikariCP max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1slave2: url: jdbc:mysql://xxx:3306/db3?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: admin password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 pool-name: springHikariCP max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1

使用起來非常簡單,只需要加上這個master的注解即可

@Override @DS('master') public DestMedia getOneByCodeFromEpg(String code) {QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq('code', code);return super.getOne(queryWrapper); }總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注好吧啦網的更多內容!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品hd| 一区二区三区网站| 午夜在线视频观看日韩17c| 特黄特色欧美大片| 伊人久久av| 午夜欧美巨大性欧美巨大| 97精品国产| 亚洲精品.com| 亚洲国产成人精品女人| 欧美日韩国产免费观看视频| 91精品国产调教在线观看| 亚洲一级少妇| 久久久国产精品一区二区中文| 色一区二区三区| 日韩在线观看| 亚洲手机在线| 亚洲专区在线| 一区在线免费观看| 美女国产精品| 日韩av中文字幕一区二区三区| 久久五月天小说| 亚洲a一区二区三区| 亚洲精品va| 在线观看视频免费一区二区三区| 蜜臀久久久久久久| 日韩在线网址| 中文字幕在线视频久| 丝袜av一区| 在线成人直播| 中文字幕av一区二区三区四区| 日本99精品| 国产精品xxxav免费视频| 国产三级精品三级在线观看国产| 国产乱码精品一区二区亚洲| 精品视频一区二区三区在线观看| 日本久久精品| 丝袜美腿诱惑一区二区三区 | 六月丁香综合| 91国内精品| 国产一区二区三区亚洲综合| 欧美日韩免费看片| 99视频在线精品国自产拍免费观看| 日韩影院精彩在线| 欧美日韩中出| аⅴ资源天堂资源库在线| 精品91福利视频| 欧美13videosex性极品| 99在线|亚洲一区二区| 91精品国产一区二区在线观看| 国产精品99久久免费| 久久久久国产精品一区二区| 九色精品91| 91精品国产一区二区在线观看| 久久精品系列| 一区在线免费| 国产精品久久久久久久久久久久久久久| 毛片在线网站| 久久午夜影视| 美女在线视频一区| 欧美福利专区| 亚洲青青久久| 日本午夜大片a在线观看| 欧美中文日韩| 麻豆视频久久| 99视频+国产日韩欧美| 国产精品一区毛片| 欧美福利一区| 国产经典一区| 国产亚洲精品自拍| 精品无人区麻豆乱码久久久| 极品日韩av| 麻豆一区在线| 免费人成在线不卡| 日韩精品一区二区三区免费观影| 国产亚洲精品精品国产亚洲综合| 999久久久精品国产| 久久精品av麻豆的观看方式| 欧美精品一线| 久久久久免费| 国产日韩欧美一区在线| 欧美日韩精品一本二本三本| 精品99在线| 91精品国产自产在线丝袜啪| 国产一区久久| 天堂а√在线最新版中文在线| 欧美一区=区三区| 国产女优一区| 亲子伦视频一区二区三区| 亚洲精品日韩久久| 电影91久久久| 日韩精品亚洲专区在线观看| 免费人成在线不卡| 美腿丝袜在线亚洲一区| 久久xxxx| 日韩一区二区在线免费| 亚洲3区在线| 波多野结衣久久精品| 亚洲69av| 超级白嫩亚洲国产第一| 国产精品毛片| 欧美成人aaa| 亚洲男女自偷自拍| 波多视频一区| 久久xxx视频| 四虎4545www国产精品 | 1000部精品久久久久久久久| 欧美午夜网站| 亚洲欧美日韩精品一区二区| 国产在视频一区二区三区吞精| 日本不卡的三区四区五区| 欧美freesex黑人又粗又大| 91p九色成人| 久久影院一区二区三区| 美女网站久久| 日韩av首页| 国产福利一区二区精品秒拍 | 欧美日韩一二三四| 国产美女视频一区二区| 六月婷婷一区| 免费在线小视频| 美腿丝袜亚洲一区| 国产美女久久| 日韩国产欧美在线播放| 黄色不卡一区| 精品免费av在线| 麻豆成人av在线| 日韩av网站在线免费观看| 免费日韩av片| 亚洲午夜视频| 在线一区免费观看| 国产主播一区| 中国字幕a在线看韩国电影| 欧美一级一区| 亚洲精品乱码日韩| 视频一区在线播放| 国精品一区二区三区| 亚洲一级影院| 日韩精品免费一区二区在线观看 | 午夜亚洲福利| 中文欧美日韩| 99成人在线| 欧美1级日本1级| 久久久久网站| 亚洲伊人av| 日韩av一区二区在线影视| 中文字幕免费精品| 在线免费观看亚洲| 亚洲在线成人| 亚洲在线成人| 免费成人性网站| 亚洲制服欧美另类| 亚洲激情久久| 蜜臀久久久99精品久久久久久| 亚洲男女av一区二区| 精品一区三区| 在线综合欧美| 日韩亚洲精品在线| 免费日韩视频| 久久亚洲国产精品一区二区| 中文字幕一区二区三区日韩精品 | 99久久夜色精品国产亚洲狼| 日韩av一级| 久久高清免费| 国产在线欧美| 免费国产自久久久久三四区久久| 夜夜嗨一区二区| 日韩制服丝袜av| 日韩毛片网站| 久久精品72免费观看| 国产日韩在线观看视频| 国产精品久久国产愉拍| 国产在线日韩精品| 久久九九电影| 女人av一区| 丝瓜av网站精品一区二区| 亚洲乱码久久| 欧美在线黄色| 国产中文欧美日韩在线| 国产91欧美| 久久激情一区| 综合激情网站| 国产精品一区2区3区| 91一区二区三区四区| 亚洲黑丝一区二区| 自拍自偷一区二区三区| 国产色噜噜噜91在线精品| 精品色999| 日韩高清欧美| 欧美在线资源| 中文字幕亚洲影视| 久久影院午夜精品| 亚洲深夜福利| 日韩精品免费视频一区二区三区 | 日韩久久精品| 亚洲久久在线| 日韩av二区| 99在线|亚洲一区二区| 欧美一区激情| 久久久久国产精品一区二区| 视频一区在线播放|