# spring-boot-dynamic-datasource
**Repository Path**: AUB/spring-boot-dynamic-datasource
## Basic Information
- **Project Name**: spring-boot-dynamic-datasource
- **Description**: 基于AOP实现的spring-boot的动态datasource工具
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-01-15
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 介绍
* 这是一个支持单库事务的,使用AOP方式实现的,适用于 spring-boot 的`动态数据源`工具,支持如下场景:
1. 需要访问多个数据库,例如:单个工程需要同时访问 A 库、B 库。
2. 需要一组读写分离,一个主库,多个从库,例如:写操作都访问 Aw 库,读操作都访问 Ar1 、 Ar2 ... Arn 库
3. 需要多组读写分离,例如:两组数据库 Aw Ar1 Ar2 、 Bw Br1 Br2,
* 不支持双写主(这种场景很少遇见)
## 安装
1. 安装到本地
```shell
git clone git@github.com:aubdiy/spring-boot-dynamic-datasource.git
cd spring-boot-dynamic-datasource
mvn install
```
2. maven依赖引入
```xml
aub.product
spring-boot-dynamic-datasource
1.0-SNAPSHOT
```
## 快速开始
### 配置数据源
在 `application.properties` 中配置数据源,
数据源均以 `spring.dynamic.datasource.` 开头
spring-boot原生数据源是以 `spring.datasource.` 开头
```
spring.dynamic.datasource.${库名}.${参数}=${值}
```
1. 配置主库
```propertis
#配置 1 个名字为 writer 的主库数据源
#数据库类型(必填,默认:com.zaxxer.hikari.HikariDataSource)
spring.dynamic.datasource.writer.type=com.zaxxer.hikari.HikariDataSource
#数据库 URL
spring.dynamic.datasource.writer.url=jdbc:mysql://127.0.0.1:3306/spring-boot-writer?useUnicode=true&characterEncoding=utf-8
#数据库账号
spring.dynamic.datasource.writer.username=root
#数据库密码
spring.dynamic.datasource.writer.password=123
#数据库驱动
spring.dynamic.datasource.writer.driver-class-name=com.mysql.jdbc.Driver
#当前主库的包含的所有从库,如果多个,使用 ',' 分割
spring.dynamic.datasource.writer.slave=reader1,reader2
#...其他数据连接信息配置
```
2. 配置从库
```propertis
#配置 2 个从主库数据源:reader1, reader2
#数据库类型(必填,默认:com.zaxxer.hikari.HikariDataSource)
spring.dynamic.datasource.reader1.type=com.zaxxer.hikari.HikariDataSource
#数据库 URL
spring.dynamic.datasource.reader1.url=jdbc:mysql://127.0.0.1:3306/spring-boot-reader1?useUnicode=true&characterEncoding=utf-8
#数据库账号
spring.dynamic.datasource.reader1.username=root
#数据库密码
spring.dynamic.datasource.reader1.password=123
#数据库驱动
spring.dynamic.datasource.reader1.driver-class-name=com.mysql.jdbc.Driver
#当从库所属的主库
spring.dynamic.datasource.reader1.master=writer
#...其他数据连接信息配置
#数据库类型(必填,默认:com.zaxxer.hikari.HikariDataSource)
spring.dynamic.datasource.reader2.type=com.zaxxer.hikari.HikariDataSource
#数据库 URL
spring.dynamic.datasource.reader2.url=jdbc:mysql://127.0.0.1:3306/spring-boot-reader2?useUnicode=true&characterEncoding=utf-8
#数据库账号
spring.dynamic.datasource.reader2.username=root
#数据库密码
spring.dynamic.datasource.reader2.password=123
#数据库驱动
spring.dynamic.datasource.reader2.driver-class-name=com.mysql.jdbc.Driver
#当从库所属的主库
spring.dynamic.datasource.reader2.master=writer
#...其他数据连接信息配置
```
### 使用数据源
在需要操作数据库的方法上,增加 `@TargetDataSource` 注解,用于切换数据源
1. 操作主库
```java
@TargetDataSource(master = "writer")
public List selectMaster() {
return this.sqlSessionTemplate.selectList("x.selectAll");
}
```
2. 操作从库,多个从库的时候,目前只支持随机选取一个从库
```java
@TargetDataSource(master = "writer", slavePolicy = DynamicDataSourcePolicy.RANDOM)
public List selectMaster() {
return this.sqlSessionTemplate.selectList("x.selectAll");
}
```
### 待完善功能点
1. 增加必要的日志打印
2. 增加例子工程
3. 增加从库选取策略
### 参考资料
1. [sunng / multi-datasource-with-transaction](https://github.com/sunng/multi-datasource-with-transaction)
2. [Spring Boot 动态数据源(多数据源自动切换)](http://blog.csdn.net/catoop/article/details/50575038)