首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

springboot+mybatis实现数据库的读写分离

介绍

随着业务的发展,除了拆分业务模块外,数据库的读写分离也是常见的优化手段。方案使用了AbstractRoutingDataSource和mybatis plugin来动态的选择数据源 选择这个方案的原因主要是不需要改动原有业务代码,非常友好

环境

首先,我们需要两个数据库实例,一为master,一为slave。所有的写操作,我们在master节点上操作 所有的读操作,我们在slave节点上操作

•需要注意的是:对于一次有读有写的事务,事务内的读操作也不应该在slave节点上,所有操作都应该在master节点上

先跑起来两个pg的实例,其中15432端口对应的master节点,15433端口对应的slave节点:

实现

整个实现主要有3个部分:

配置两个数据源

实现AbstractRoutingDataSource来动态的使用数据源 实现mybatis plugin来动态的选择数据源 配置数据源 将数据库连接信息配置到application.yml文件中

write写数据源,对应到master节点的15432端口 read读数据源,对应到slave节点的15433端口

将两个数据源信息注入为DataSourceProperties:

实现AbstractRoutingDataSource

spring提供了AbstractRoutingDataSource,提供了动态选择数据源的功能,替换原有的单一数据源后,即可实现读写分离:

AbstractRoutingDataSource内部维护了一个Map的Map 在初始化过程中,我们将write、read两个数据源加入到这个map 调用数据源时:determineCurrentLookupKey()方法返回了需要使用的数据源对应的key

当前线程需要使用的数据源对应的key,是在DataSourceHolder类中维护的:

实现mybatis plugin

上面提到了当前线程使用的数据源对应的key,这个key需要在mybatis plugin根据sql类型来确定 MybatisDataSourceInterceptor类:

复制代码仅当未在事务中,并且调用的sql是select类型时,在DataSourceHolder中将数据源设为read 其他情况下,AbstractRoutingDataSource会使用默认的write数据源

至此,项目已经可以自动的在读、写数据源间切换,无需修改原有的业务代码 最后,提供demo使用依赖版本

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OXgHz96cWoSYAWMpo0Y2nXhg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券