自己封装了一个读写分离的 Starter,可以配置任意多个数据源,使用 Hikari 连接池(暂不支持其他连接池)。

GitHub:rw-separate-spring-boot-starter

代码已上传到 Maven 中央仓库,可以直接使用:

<dependency>
<groupId>top.cloudli</groupId>
<artifactId>rw-separate-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>

**首先需要排除默认的 DataSourceAutoConfiguration **:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class FooApplication { public static void main(String[] args) {
SpringApplication.run(FooApplication.class, args);
} }

HikariCP 配置

hikari 的配置没有变化,与 Spring Boot 默认的配置方式一样:

spring:
datasource:
hikari:
minimum-idle: 50
maximum-pool-size: 500
connection-test-query: "SELECT 1"
...

application.yml

spring:
separated-datasource:
# 主库数据源
masters:
- {
dataSourceName: master_1,
driverClassName: com.mysql.cj.jdbc.Driver,
url: jdbc:mysql://10.0.0.100:3306/test,
username: root,
password: root
} # 从库数据源
slaves:
- {
dataSourceName: slave_1,
driverClassName: com.mysql.cj.jdbc.Driver,
url: jdbc:mysql://10.0.0.101:3306/test,
username: reader,
password: reader
}
- {
dataSourceName: slave_2,
driverClassName: com.mysql.cj.jdbc.Driver,
url: jdbc:mysql://10.0.0.102:3306/test,
username: reader,
password: reader
}
  • dataSourceName 为数据源的名称,请避免名称重复(如果不需要显式地指定数据源,可以不设置)。
  • 当设置多个数据源时,默认使用轮询的方式来切换数据源。

MyBatis 数据源配置

自动装配的数据源为 routingDataSource

@Configuration
@EnableTransactionManagement
public class MyBatisConfig { // 注入 routingDataSource
@Resource(name = "routingDataSource")
private DataSource dataSource; @Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mybatis/mapper/*.xml")); return sqlSessionFactoryBean.getObject();
} @Bean
public PlatformTransactionManager platformTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}

也可以这样(Bean 的名称必须为 routingDataSource):

private final DataSource routingDataSource;

public MyBatisConfig(DataSource routingDataSource) {
this.routingDataSource = routingDataSource;
}

使用注解实现读写分离

@Service
public class FooService { @Resource
FooMapper fooMapper; /**
* 使用读库
*/
@Read
public List<Item> getFoo() {
return fooMapper.getAll();
} /**
* 使用写库
*/
@Write
public int addFoo(Foo foo) {
return fooMapper.add(foo);
}
}

可以使用参数显式地指定数据源(需要在 application.yml 中指定 dataSourceName):

@Service
public class FooService { /**
* 显式地指定数据源为 master_1
*/
@Write("master_1")
public int addFoo(Foo foo) {
return fooMapper.add(foo);
} }

显式地指定数据源时,@Write 只能指定 masters 中的数据源,@Read 只能指定 slaves 中的数据源

不要在 DAO 层使用读写分离,无法支持事务。

Spring Boot 主从读写分离的更多相关文章

  1. Spring Boot + Sharding-JDBC 读写分离

    本文使用 Sharding-JDBC 实现读写分离,基于 CentOS 7 + MySQL 5.7 一.MySQL 安装及配置 1.1 安装 依次执行命令: sudo wget -i -c http: ...

  2. 使用Spring 或Spring Boot实现读写分离( MySQL实现主从复制)

    http://blog.csdn.net/jack85986370/article/details/51559232 http://blog.csdn.net/neosmith/article/det ...

  3. Spring AOP 实现读写分离

    原文地址:Spring AOP 实现读写分离 博客地址:http://www.extlight.com 一.前言 上一篇<MySQL 实现主从复制> 文章中介绍了 MySQL 主从复制的搭 ...

  4. 使用Spring实现MySQL读写分离(转)

    使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ...

  5. spring+mybatis实现读写分离

    springmore-core spring+ibatis实现读写分离 特点 无缝结合spring+ibatis,对于程序员来说,是透明的 除了修改配置信息之外,程序的代码不需要修改任何东西 支持sp ...

  6. Amoeba搞定mysql主从读写分离

    前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...

  7. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

  8. CRL快速开发框架4.4版发布,支持主从读写分离

    经过一些调整和优化,4.3已经运行在生产环境,对于不久将会遇到的查询性能,读写分离需求列上日程 读写分离需求 对于一个数据库作了主从发布/订阅,主库为DB1,从库为DB2 所有写入通过DB1,所有查询 ...

  9. 基于Amoba实现mysql主从读写分离

    一.Amoeba简介           Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特 ...

随机推荐

  1. office viso 2007根据现有数据库建立数据库模型图

    当数据库表很多的时候,表之间的关系就变得很复杂.光凭记忆很难记住,尤其是数据库键值没有外键约束时. 所以有个数据库模型图各个表之间的关系就显而易见了. 打开 office viso 2007 文件&g ...

  2. 并发编程(五)--GIL、死锁现象与递归锁、信号量、Event事件、线程queue

    一.GIL全局解释器锁 1.什么是全局解释器锁 GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程,必须抢到GIL之后才能使用Cpython解释器来执行自己的 ...

  3. 指针专题6-空指针NULL和void指针

    1 NULL指针 一个指针变量可以指向计算机中任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给他,他就可以指向.C语言没有一种机制保证指向内存的正确性,程序员必须自己提高 ...

  4. 让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 公元1951年5月15日的国会听证上, ...

  5. Alipay SDK验签PHP低于5.5版本错误

    低于PHP5.5版本不支持OPENSSL_ALGO_SHA256函数,要想使用RSA2加密,把OPENSSL_ALGO_SHA256函数替换为:sha256WithRSAEncryption 解密方法 ...

  6. 第12节-BLE协议HCI层的数据格式

    学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...

  7. Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity (超级源点)

  8. [RN] React Native 定义全局变量

    React Native 定义全局变量 React Native全局变量的两种使用方式 一.导出和导入 // 定义的页面 global.js var global = {authorization: ...

  9. Android 10 终于来了!增加了不少新特性

    前言 Android 10 正式发布了,根据官网的介绍,聚焦于隐私可控.手机自定义与使用效率,此版本主要带来了十大新特性:   image 智能回复 使用机器学习来预测你在回复信息时可能会说些什么,这 ...

  10. [技术博客] 微信小程序的formid获取

    微信小程序的formid获取 formId的触发 微信小程序可以通过收集用户的formid,获取formid给用户主动推送微信消息.获取formid有两个途径,一个是触发一次表单提交,或者触发一次支付 ...