Mybatis读写分离

本文介绍了Mybatis实现读写分离的方法,包括使用现成工具如MyCat和ShardingSphere,以及通过Mybatis拦截器自定义实现。在讨论中提到了ShardingSphere-JDBC在事务中的读写行为,并详细讲解了如何在代码层面配置多数据源,编写拦截器根据SQL类型选择数据源,确保读写操作正确路由。
摘要由CSDN通过智能技术生成

现成工具介绍

MyCat

活跃的、性能好的开源数据库中间件。它是一个透明化的数据库代理端,在生产环境使用需要保证服务的高可用。

ShardingSphere

ShardingSphere由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。其中ShardingSphere-Proxy与MyCat是相同的定位,而ShardingSphere-JDBC在 Java 的 JDBC 层提供的额外服务。

SpringBoot集成ShardingSphere-JDBC也非常方便,引入包,编写好配置文档就可立即使用。但在事务中有一点点问题,就是在事务中有写操作后,以后的读操作才都从主库读取;也就是说在写操作前,事务里的读还是从从库里读的,这可能会造成脏写。

使用Mybatis拦截器

代码层面的读写分离大部分都是拦截sql, 通过判断sql的读写类型来重定向数据库的,ShardingSphere-JDBC也不例外。

Mybatis允许我们自定义拦截器,需要实现Interceptor接口,并且在自定义拦截器类上添加@Intercepts注解。在@Intercepts注解中,我们可以指定拦截的方法。

开干

多数据源

既然是在代码层面进行读写分离,那肯定是有读&写两个库了,这里就用到了多数据源功能,这里没有用Mybatis/Mybatis-Plus默认的多数据源的生成方式,而是自己配置了多数据源,其实也可以用默认生成的方式,自己写一遍的目的是为了更加了解里面的原理。[配置文件里配置的格式就照Mybatis-Plus多数据源配置的格式配]

代码
多数据源配置
/**
 * 数据库主库
 */
@Bean
@ConfigurationProperties("spring.datasource.dynamic.datasource.master")
public DataSource masterDataSource(){
    log.info("加载主数据源master DataSource.");
    return DruidDataSourceBuilder.create().build();
}

/**
 * 数据库从库
 */
@Bean
@ConfigurationProperties("spring.datasource.dynamic.datasource.slave1")
public DataSource slave1DataSource(){
    log.info("加载从数据源slave1 DataSource.");
    return DruidDataSourceBuilder.create().build();
}

/**
 * 动态数据源
 */
@Bean
public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值