Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ifyun/rw-separate-spring-boot-starter
Spring Boot 多主从数据源读写分离
https://github.com/ifyun/rw-separate-spring-boot-starter
multi-datasource read-write-separation spring-boot
Last synced: 2 months ago
JSON representation
Spring Boot 多主从数据源读写分离
- Host: GitHub
- URL: https://github.com/ifyun/rw-separate-spring-boot-starter
- Owner: ifyun
- License: mit
- Created: 2019-09-14T02:22:26.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-04-28T05:44:26.000Z (over 3 years ago)
- Last Synced: 2024-10-30T16:10:13.193Z (2 months ago)
- Topics: multi-datasource, read-write-separation, spring-boot
- Language: Java
- Size: 29.3 KB
- Stars: 8
- Watchers: 3
- Forks: 8
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Spring Boot 主从读写分离
![GitHub last commit](https://img.shields.io/github/last-commit/imcloudfloating/rw-separate-spring-boot-starter?style=flat-square)
![GitHub license](https://img.shields.io/github/license/imcloudfloating/rw-separate-spring-boot-starter?style=flat-square)
[![JitPack](https://img.shields.io/jitpack/v/github/imcloudfloating/rw-separate-spring-boot-starter?style=flat-square)](https://jitpack.io/#imcloudfloating/rw-separate-spring-boot-starter)rw-separate-spring-boot-starter 是一个可以实现任意多个主从数据源读写分离的工具,
使用 Hikari 连接池(暂不支持其他连接池,后期可能会添加支持)。> 本工具库只是替换了 Spring Boot 数据源,你可以随意选择 ORM 框架,JPA,MyBatis 都可以使用。
## 使用
Step 1. 添加 jitpack 到 pom.xml:
```xml
jitpack.io
https://www.jitpack.io
```
Step 2. 添加依赖:
```xml
com.github.imcloudfloating
rw-separate-spring-boot-starter
1.0.1```
首先需要排除默认的 `DataSourceAutoConfiguration` :
```java
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class FooApplication {public static void main(String[] args) {
SpringApplication.run(FooApplication.class, args);
}
}
```> 不排除默认的 `DataSource` 会报冲突错误。
### application.yml 配置
示例:
```yaml
spring:
separated-datasource:
# 主库数据源
masters:
- dataSourceName: master_1
hikari:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.0.0.100:3306/test
username: root
password: root# 从库数据源
slaves:
- dataSourceName: slave_1
hikari:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.0.0.101:3306/test
username: reader
password: reader
- dataSourceName: slave_2
hikari:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.0.0.102:3306/test
username: reader
password: reader
```- 以上配置文件中的 `hikari` 部分,可以参考 `HikariConfig` 类中的 setter 方法来填写(首字母小写)
- `dataSourceName` 为数据源的名称,请避免名称重复(如果不需要显式地指定数据源,可以不设置)
- 当设置多个数据源时,默认使用轮询的方式来切换数据源
- 可以只设置 `master` ,使用名称切换,当作多数据源使用,使用 `@Write("datasource")` 切换即可### 使用注解实现读写分离
```java
@Service
public class FooService {@Resource
FooMapper fooMapper;
/**
* 使用读库
*/
@Read
public List getFoo() {
return fooMapper.getAll();
}/**
* 使用写库
*/
@Write
public int addFoo(Foo foo) {
return fooMapper.add(foo);
}
}
```可以使用参数显式地指定数据源(需要在 `application.yml` 中指定 `dataSourceName`):
```java
@Service
public class FooService {/**
* 显式地指定数据源为 master_1
*/
@Write("master_1")
public int addFoo(Foo foo) {
return fooMapper.add(foo);
}}
```显式地指定数据源时,`@Write` 只能指定 masters 中的数据源,`@Read` 只能指定 slaves 中的数据源。
> 可以在 DAO 层使用,但是无法支持事务。