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

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

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

瀏覽:36日期: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久久,三上悠亚国产精品一区二区三区
亚洲va在线| 男人操女人的视频在线观看欧美| 亚洲91网站| 久久亚洲欧洲| 四虎精品一区二区免费| 日韩欧美另类中文字幕| 日韩精品久久久久久| 国产精品欧美一区二区三区不卡| 国产精品美女午夜爽爽| 日韩精品欧美大片| 国产乱人伦丫前精品视频| 国产福利一区二区精品秒拍| 国产一区调教| 99久久亚洲精品蜜臀| 亚洲资源av| 国产乱码精品一区二区三区四区| 久久xxx视频| 成人片免费看| 国产亚洲毛片| 国产欧美日韩精品一区二区免费 | 激情五月综合网| 蜜桃久久久久久久| 麻豆91小视频| 99国产精品| 国产伦理一区| 久久精品不卡| 亚洲精品影视| 国产传媒av在线| 丝袜美腿一区二区三区| 国产精品久一| 午夜av一区| 国产精品一区三区在线观看| 色爱av综合网| 日韩亚洲精品在线观看| 国产精品久久久久久模特 | 日韩和欧美一区二区| 高清久久一区| 亚洲综合不卡| 精品成人18| 丝袜美腿亚洲色图| 91欧美国产| 亚洲91在线| 99久久精品费精品国产| 国产精品一页| 鲁大师成人一区二区三区| 久久久久亚洲精品中文字幕| 黄色av一区| 色婷婷色综合| 欧美日韩视频免费看| 999国产精品视频| 国产日本精品| 亚洲欧美日韩一区在线观看| 精品美女在线视频| 婷婷亚洲成人| 红桃视频亚洲| 欧美精品日日操| 国产精品一区亚洲| 涩涩涩久久久成人精品| 亚洲精品成人| 国产一二在线播放| 欧美一区影院| 日韩一级精品| 成人日韩在线| 福利视频一区| 麻豆精品少妇| 91成人在线精品视频| 国产真实久久| 国产精品伦理久久久久久| 欧美日韩18| 日韩中文字幕| 免费成人在线视频观看| 欧美 日韩 国产一区二区在线视频 | 丝袜美腿高跟呻吟高潮一区| 特黄毛片在线观看| 久久麻豆视频| 国产日产一区| 热久久久久久| 欧美日韩一区自拍| 中文字幕中文字幕精品| 亚洲黄页一区| 制服诱惑一区二区| 自由日本语亚洲人高潮| 在线日韩一区| 国产 日韩 欧美一区| 丰满少妇一区| 麻豆精品新av中文字幕| 国产福利资源一区| 国产精品s色| 欧美日韩国产一区二区在线观看| 国产模特精品视频久久久久| 欧美福利在线| 亚洲成人日韩| 欧美日韩在线网站| 欧美亚洲国产精品久久| 91精品国产自产在线观看永久∴ | 国产精品av久久久久久麻豆网| 日韩黄色大片网站| 桃色一区二区| 91精品国产乱码久久久久久久 | 国产精品va| 久久久免费人体| 精品久久久久中文字幕小说| 精品国产欧美日韩| av中文资源在线资源免费观看| 高清久久精品| 日韩欧美一区免费| 久久精品亚洲欧美日韩精品中文字幕| 国产精品成人一区二区不卡| 韩日一区二区| 久久精品国产www456c0m| 欧美精品自拍| 免费在线观看一区二区三区| 日韩中文字幕在线一区| 国产精品久久久久久久久久久久久久久| 国产精品亚洲综合色区韩国| 老司机精品视频在线播放| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 免播放器亚洲| 蜜桃av一区二区| 日韩国产欧美三级| 国产欧美日韩精品一区二区免费 | 亚洲午夜在线| 国产一区成人| 日韩二区三区在线观看| 久久影院一区二区三区| 91精品国产调教在线观看| 日av在线不卡| 久久99性xxx老妇胖精品| 国产不卡精品在线| 欧美日韩国产免费观看| 青青青国产精品| 日韩国产一区二区| 视频一区欧美日韩| 久久精品国产999大香线蕉| 欧美日韩在线网站| 亚洲乱码久久| 国产精品毛片久久| 久久成人精品| 麻豆国产欧美一区二区三区 | 清纯唯美亚洲综合一区| 成人国产精品一区二区网站| 美女毛片一区二区三区四区| 一区二区国产精品| 97精品视频在线看| 免费在线欧美视频| 欧美国产小视频| 日本欧美在线看| 久久超级碰碰| 六月天综合网| 国产v日韩v欧美v| 日本v片在线高清不卡在线观看| 精品三级国产| 亚洲午夜久久| 久久久久蜜桃| 久久精品一区二区三区中文字幕| 宅男噜噜噜66国产日韩在线观看| 久久精品国产一区二区| 视频一区欧美日韩| 日韩成人亚洲| 国产精品分类| 日韩一区精品字幕| 日韩大片在线播放| 蜜桃视频一区二区| 日韩免费福利视频| 久久国内精品自在自线400部| 亚洲午夜视频| 日韩a一区二区| 国产精品乱战久久久| 三级欧美在线一区| 999久久久91| 亚洲国产福利| 久久a爱视频| 久久国产三级精品| 综合激情在线| 不卡一区综合视频| 午夜影院一区| 麻豆免费精品视频| 热久久国产精品| 亚洲激情久久| 国产91久久精品一区二区| 国产精品久久久久久久久妇女| 国产精品视频3p| 日韩欧美2区| 免费精品视频在线| 樱桃成人精品视频在线播放| 日韩久久电影| 福利欧美精品在线| 精品日产乱码久久久久久仙踪林| 日韩精品久久久久久久软件91| 久久国产高清| 美日韩精品视频| 最新日韩av| 99精品在线观看| 播放一区二区| 成人免费网站www网站高清| 免费看av不卡| 日本免费久久| 亚洲最新无码中文字幕久久| 福利一区视频| 婷婷综合六月|