Spring Boot 主从读写分离
自己封装了一个读写分离的 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 主从读写分离的更多相关文章
- Spring Boot + Sharding-JDBC 读写分离
本文使用 Sharding-JDBC 实现读写分离,基于 CentOS 7 + MySQL 5.7 一.MySQL 安装及配置 1.1 安装 依次执行命令: sudo wget -i -c http: ...
- 使用Spring 或Spring Boot实现读写分离( MySQL实现主从复制)
http://blog.csdn.net/jack85986370/article/details/51559232 http://blog.csdn.net/neosmith/article/det ...
- Spring AOP 实现读写分离
原文地址:Spring AOP 实现读写分离 博客地址:http://www.extlight.com 一.前言 上一篇<MySQL 实现主从复制> 文章中介绍了 MySQL 主从复制的搭 ...
- 使用Spring实现MySQL读写分离(转)
使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ...
- spring+mybatis实现读写分离
springmore-core spring+ibatis实现读写分离 特点 无缝结合spring+ibatis,对于程序员来说,是透明的 除了修改配置信息之外,程序的代码不需要修改任何东西 支持sp ...
- Amoeba搞定mysql主从读写分离
前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
- CRL快速开发框架4.4版发布,支持主从读写分离
经过一些调整和优化,4.3已经运行在生产环境,对于不久将会遇到的查询性能,读写分离需求列上日程 读写分离需求 对于一个数据库作了主从发布/订阅,主库为DB1,从库为DB2 所有写入通过DB1,所有查询 ...
- 基于Amoba实现mysql主从读写分离
一.Amoeba简介 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特 ...
随机推荐
- Spring项目配置多数据源
项目中有用到多数据源,并进行动态切换,使用的是阿里的druid.看网上有一篇大致一样的就偷偷懒 import java.sql.SQLFeatureNotSupportedException; imp ...
- MySQL Other--mysql_config_editor学习使用
mysql_config_editor工具 为避免MySQL明文密码出现在脚本或命令中,从MySQL5.6开始提供了mysql_config_editor工具,可以将数据库连接信息进行加密并保存到用户 ...
- axios 下载文件
axio请求里必须加 responseType: 'blob' 参数,如下 //下载文件 api.download=function(id) { return request({ url: this ...
- 借助模板类自动实现COM连接点接收器(Sink)更新
之前在借助模板类自动实现COM连接点接收器(Sink)中对原作者的代码进一步封装,弄清了连接点使用的原理,在看ATL代码的过程中,发现ATL本身就提供了AtlAdvise/AtlUnadvise这样的 ...
- 第03节-BLE协议各层数据格式概述
本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...
- Caused by: java.lang.ClassNotFoundException: Cannot find class:
Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibat ...
- sudo:有效用户 ID 不是 0,sudo 属于 root 并设置了 setuid 位吗?
由于误操作导致无法使用sudo切换root用户 直接进入root用户并恢复文件权限,解决办法: chmod 4755 /usr/bin/sudo chmod 755 /usr/libexec/ses ...
- 访问阿里云 vue项目的 127.0.0.1:+ip
vue 127.0.0.1 将 localhost 改为 0.0.0.0 原理看下面链接 参考: https://www.cnblogs.com/sddai/p/9281189.html
- UFUN函数 UF_UI UF_PART函数(UF_UI_select_with_class_dialog, UF_PART_export_with_options)
/*主要演示 UF_PART_export_with_options 这个函数 */1 //设置class_dialog选择过滤 static int init_proc(UF_UI_selectio ...
- Pandas | 19 合并/连接
Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似.Pandas提供了一个单独的merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口 - pd.me ...