电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:7日期: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 數據庫
相關文章:
主站蜘蛛池模板: 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 科客,主见不成见| WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 软装设计-提供软装装饰和软装配饰及软装陈设的软装设计公司 | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 健康管理师报名入口,2025年健康管理师考试时间信息网-网站首页 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 硫酸钡厂家_高光沉淀硫酸钡价格-河南钡丰化工有限公司 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 全自动包衣机-无菌分装隔离器-浙江迦南科技股份有限公司 | 昊宇水工|河北昊宇水工机械工程有限公司 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 浙江自考_浙江自学考试网| 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 |