Skip to content

Commit 133cf59

Browse files
authored
Merge branch 'hikari' into 2020-api
2 parents 5051687 + f26f308 commit 133cf59

File tree

8 files changed

+113
-191
lines changed

8 files changed

+113
-191
lines changed

.github/workflows/gradle.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Java CI
2+
3+
on: [push]
4+
5+
jobs:
6+
build:
7+
8+
runs-on: ubuntu-latest
9+
10+
steps:
11+
- uses: actions/checkout@v1
12+
- name: Set up JDK 1.8
13+
uses: actions/setup-java@v1
14+
with:
15+
java-version: 1.8
16+
- name: Build with Gradle
17+
run: ./gradlew clean build -x test

README.md

Lines changed: 45 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
- [druid](https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/druid): 通过切面和注解方式实现的使用 Druid 连接池的动态数据源切换
88
- [aspect_dao](https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/aspect_dao): 通过切面实现的 DAO 层的动态数据源切换
99
- [roundrobin](https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/roundrobin): 通过切面使用轮询方式实现的只读数据源负载均衡
10-
- [hikari](https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/hikari): 升级到SpringBoot 2.0, 数据源使用 Hikari
10+
- [hikari](https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/hikari): 升级到SpringBoot 2.0版本 数据源使用 Hikar
11+
- **[多数据源分布式事务](https://github.com/helloworlde/spring-cloud-alibaba-component/tree/master/cloud-seata-multi-datasource): 使用 [Seata](https://github.com/seata/seata) 实现的多数据源事务**
12+
1113

1214
> 以上分支都是基于 dev 分支修改或扩充而来,基本涵盖了常用的多数据源动态切换的方式,基本的原理都一样,都是通过切面根据不同的条件在执行数据库操作前切换数据源
1315
@@ -29,10 +31,9 @@
2931
## 添加依赖
3032
```groovy
3133
dependencies {
32-
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
34+
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
3335
compile('org.springframework.boot:spring-boot-starter-web')
3436
compile('org.springframework.boot:spring-boot-starter-aop')
35-
compile('com.alibaba:druid-spring-boot-starter:1.1.6')
3637
runtime('mysql:mysql-connector-java')
3738
testCompile('org.springframework.boot:spring-boot-starter-test')
3839
}
@@ -84,88 +85,40 @@ INSERT INTO product_slave_gamma.product (name, price) VALUES('slaveGamma', '1');
8485
- application.properties
8586

8687
```properties
88+
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
8789
# Master datasource config
88-
spring.datasource.druid.master.name=master
89-
spring.datasource.druid.master.driver-class-name=com.mysql.jdbc.Driver
90-
spring.datasource.druid.master.url=jdbc:mysql://localhost/product_master?useSSL=false
91-
spring.datasource.druid.master.port=3306
92-
spring.datasource.druid.master.username=root
93-
spring.datasource.druid.master.password=123456
90+
spring.datasource.hikari.master.name=master
91+
spring.datasource.hikari.master.driver-class-name=com.mysql.jdbc.Driver
92+
spring.datasource.hikari.master.jdbc-url=jdbc:mysql://localhost/product_master?useSSL=false
93+
spring.datasource.hikari.master.port=3306
94+
spring.datasource.hikari.master.username=root
95+
spring.datasource.hikari.master.password=123456
9496

9597
# SlaveAlpha datasource config
96-
spring.datasource.druid.slave-alpha.name=SlaveAlpha
97-
spring.datasource.druid.slave-alpha.driver-class-name=com.mysql.jdbc.Driver
98-
spring.datasource.druid.slave-alpha.url=jdbc:mysql://localhost/product_slave_alpha?useSSL=false
99-
spring.datasource.druid.slave-alpha.port=3306
100-
spring.datasource.druid.slave-alpha.username=root
101-
spring.datasource.druid.slave-alpha.password=123456
98+
spring.datasource.hikari.slave-alpha.name=SlaveAlpha
99+
spring.datasource.hikari.slave-alpha.driver-class-name=com.mysql.jdbc.Driver
100+
spring.datasource.hikari.slave-alpha.jdbc-url=jdbc:mysql://localhost/product_slave_alpha?useSSL=false
101+
spring.datasource.hikari.slave-alpha.port=3306
102+
spring.datasource.hikari.slave-alpha.username=root
103+
spring.datasource.hikari.slave-alpha.password=123456
102104

103105
# SlaveBeta datasource config
104-
spring.datasource.druid.slave-beta.name=SlaveBeta
105-
spring.datasource.druid.slave-beta.driver-class-name=com.mysql.jdbc.Driver
106-
spring.datasource.druid.slave-beta.url=jdbc:mysql://localhost/product_slave_beta?useSSL=false
107-
spring.datasource.druid.slave-beta.port=3306
108-
spring.datasource.druid.slave-beta.username=root
109-
spring.datasource.druid.slave-beta.password=123456
106+
spring.datasource.hikari.slave-beta.name=SlaveBeta
107+
spring.datasource.hikari.slave-beta.driver-class-name=com.mysql.jdbc.Driver
108+
spring.datasource.hikari.slave-beta.jdbc-url=jdbc:mysql://localhost/product_slave_beta?useSSL=false
109+
spring.datasource.hikari.slave-beta.port=3306
110+
spring.datasource.hikari.slave-beta.username=root
111+
spring.datasource.hikari.slave-beta.password=123456
110112

111113
# SlaveGamma datasource config
112-
spring.datasource.druid.slave-gamma.name=SlaveGamma
113-
spring.datasource.druid.slave-gamma.driver-class-name=com.mysql.jdbc.Driver
114-
spring.datasource.druid.slave-gamma.url=jdbc:mysql://localhost/product_slave_gamma?useSSL=false
115-
spring.datasource.druid.slave-gamma.port=3306
116-
spring.datasource.druid.slave-gamma.username=root
117-
spring.datasource.druid.slave-gamma.password=123456
118-
119-
# Druid dataSource config
120-
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
121-
spring.datasource.druid.initial-size=5
122-
spring.datasource.druid.max-active=20
123-
spring.datasource.druid.min-idle=5
124-
spring.datasource.druid.max-wait=60000
125-
spring.datasource.druid.pool-prepared-statements=false
126-
spring.datasource.druid.validation-query=SELECT 1
127-
spring.datasource.druid.validation-query-timeout=30000
128-
spring.datasource.druid.test-on-borrow=false
129-
spring.datasource.druid.test-on-return=false
130-
spring.datasource.druid.test-while-idle=true
131-
#spring.datasource.druid.time-between-eviction-runs-millis=
132-
#spring.datasource.druid.min-evictable-idle-time-millis=
133-
#spring.datasource.druid.max-evictable-idle-time-millis=10000
134-
135-
# Druid stat filter config
136-
spring.datasource.druid.filters=stat,wall,log4j
137-
spring.datasource.druid.web-stat-filter.enabled=true
138-
spring.datasource.druid.web-stat-filter.url-pattern=/*
139-
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
140-
spring.datasource.druid.web-stat-filter.session-stat-enable=true
141-
spring.datasource.druid.web-stat-filter.session-stat-max-count=10
142-
spring.datasource.druid.web-stat-filter.principal-session-name=user
143-
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
144-
spring.datasource.druid.web-stat-filter.profile-enable=true
145-
spring.datasource.druid.filter.stat.db-type=mysql
146-
spring.datasource.druid.filter.stat.log-slow-sql=true
147-
spring.datasource.druid.filter.stat.slow-sql-millis=1000
148-
spring.datasource.druid.filter.stat.merge-sql=true
149-
spring.datasource.druid.filter.wall.enabled=true
150-
spring.datasource.druid.filter.wall.config.delete-allow=true
151-
spring.datasource.druid.filter.wall.config.drop-table-allow=false
152-
spring.datasource.druid.filter.slf4j.enabled=true
153-
# Druid manage page config
154-
spring.datasource.druid.stat-view-servlet.enabled=true
155-
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
156-
spring.datasource.druid.stat-view-servlet.reset-enable=true
157-
spring.datasource.druid.stat-view-servlet.login-username=admin
158-
spring.datasource.druid.stat-view-servlet.login-password=admin
159-
#spring.datasource.druid.stat-view-servlet.allow=
160-
#spring.datasource.druid.stat-view-servlet.deny=
161-
spring.datasource.druid.use-global-data-source-stat=true
162-
# Druid AOP config
163-
spring.datasource.druid.aop-patterns=cn.com.hellowood.dynamicdatasource.service.*
164-
spring.aop.proxy-target-class=true
114+
spring.datasource.hikari.slave-gamma.name=SlaveGamma
115+
spring.datasource.hikari.slave-gamma.driver-class-name=com.mysql.jdbc.Driver
116+
spring.datasource.hikari.slave-gamma.jdbc-url=jdbc:mysql://localhost/product_slave_gamma?useSSL=false
117+
spring.datasource.hikari.slave-gamma.port=3306
118+
spring.datasource.hikari.slave-gamma.username=root
119+
spring.datasource.hikari.slave-gamma.password=123456
165120

166-
# MyBatis config
167-
mybatis.type-aliases-package=cn.com.hellowood.dynamicdatasource.mapper
168-
mybatis.mapper-locations=mappers/**Mapper.xml
121+
spring.aop.proxy-target-class=true
169122
server.port=9999
170123
```
171124

@@ -216,7 +169,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
216169
package cn.com.hellowood.dynamicdatasource.configuration;
217170

218171
import org.mybatis.spring.SqlSessionFactoryBean;
219-
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
172+
import org.springframework.boot.jdbc.DataSourceBuilder;
220173
import org.springframework.boot.context.properties.ConfigurationProperties;
221174
import org.springframework.context.annotation.Bean;
222175
import org.springframework.context.annotation.Configuration;
@@ -239,9 +192,9 @@ public class DataSourceConfigurer {
239192
*/
240193
@Bean("master")
241194
@Primary
242-
@ConfigurationProperties(prefix = "spring.datasource.druid.master")
195+
@ConfigurationProperties(prefix = "spring.datasource.hikari.master")
243196
public DataSource master() {
244-
return DruidDataSourceBuilder.create().build();
197+
return DataSourceBuilder.create().build();
245198
}
246199

247200
/**
@@ -250,9 +203,9 @@ public class DataSourceConfigurer {
250203
* @return the data source
251204
*/
252205
@Bean("slaveAlpha")
253-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-alpha")
206+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-alpha")
254207
public DataSource slaveAlpha() {
255-
return DruidDataSourceBuilder.create().build();
208+
return DataSourceBuilder.create().build();
256209
}
257210

258211
/**
@@ -261,9 +214,9 @@ public class DataSourceConfigurer {
261214
* @return the data source
262215
*/
263216
@Bean("slaveBeta")
264-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-beta")
217+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-beta")
265218
public DataSource slaveBeta() {
266-
return DruidDataSourceBuilder.create().build();
219+
return DataSourceBuilder.create().build();
267220
}
268221

269222
/**
@@ -274,7 +227,7 @@ public class DataSourceConfigurer {
274227
@Bean("slaveGamma")
275228
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-gamma")
276229
public DataSource slaveGamma() {
277-
return DruidDataSourceBuilder.create().build();
230+
return DataSourceBuilder.create().build();
278231
}
279232

280233
/**
@@ -316,6 +269,10 @@ public class DataSourceConfigurer {
316269
@ConfigurationProperties(prefix = "mybatis")
317270
public SqlSessionFactoryBean sqlSessionFactoryBean() {
318271
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
272+
// 配置 MyBatis
273+
sqlSessionFactoryBean.setTypeAliasesPackage("cn.com.hellowood.dynamicdatasource.mapper");
274+
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("mappers/**Mapper.xml"));
275+
319276
// 配置数据源,此处配置为关键配置,如果没有将 dynamicDataSource 作为数据源则不能实现切换
320277
sqlSessionFactoryBean.setDataSource(dynamicDataSource());
321278
return sqlSessionFactoryBean;
@@ -347,18 +304,11 @@ import org.slf4j.LoggerFactory;
347304

348305
import java.util.ArrayList;
349306
import java.util.List;
350-
import java.util.concurrent.locks.Lock;
351-
import java.util.concurrent.locks.ReentrantLock;
352307

353308
public class DynamicDataSourceContextHolder {
354309

355310
private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
356311

357-
/**
358-
* 用于在切换数据源时保证不会被其他线程修改
359-
*/
360-
private static Lock lock = new ReentrantLock();
361-
362312
/**
363313
* 用于轮循的计数器
364314
*/
@@ -400,7 +350,6 @@ public class DynamicDataSourceContextHolder {
400350
* 当使用只读数据源时通过轮循方式选择要使用的数据源
401351
*/
402352
public static void useSlaveDataSource() {
403-
lock.lock();
404353

405354
try {
406355
int datasourceKeyIndex = counter % slaveDataSourceKeys.size();
@@ -410,9 +359,7 @@ public class DynamicDataSourceContextHolder {
410359
logger.error("Switch slave datasource failed, error message is {}", e.getMessage());
411360
useMasterDataSource();
412361
e.printStackTrace();
413-
} finally {
414-
lock.unlock();
415-
}
362+
}
416363
}
417364

418365
/**
@@ -467,7 +414,7 @@ import org.springframework.stereotype.Component;
467414
public class DynamicDataSourceAspect {
468415
private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceAspect.class);
469416

470-
private final String[] QUERY_PREFIX = {"select"};
417+
private final String[] QUERY_PREFIX = {"get"};
471418

472419
@Pointcut("execution( * cn.com.hellowood.dynamicdatasource.mapper.*.*(..))")
473420
public void daoAspect() {
@@ -483,7 +430,7 @@ public class DynamicDataSourceAspect {
483430
}
484431
}
485432

486-
@After("daoAspect())")
433+
@After("daoAspect()")
487434
public void restoreDataSource(JoinPoint point) {
488435
DynamicDataSourceContextHolder.clearDataSourceKey();
489436
logger.info("Restore DataSource to [{}] in Method [{}]",

build.gradle

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
buildscript {
22
ext {
3-
springBootVersion = '1.5.9.RELEASE'
3+
springBootVersion = '2.0.1.RELEASE'
44
}
55
repositories {
66
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
@@ -14,6 +14,7 @@ buildscript {
1414
apply plugin: 'java'
1515
apply plugin: 'eclipse'
1616
apply plugin: 'org.springframework.boot'
17+
apply plugin: 'io.spring.dependency-management'
1718

1819
group = 'cn.com.hellowood'
1920
version = '0.0.1-SNAPSHOT'
@@ -26,7 +27,8 @@ repositories {
2627

2728

2829
dependencies {
29-
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
30+
compile('org.springframework.boot:spring-boot-starter-parent:2.0.1.RELEASE')
31+
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
3032
compile('org.springframework.boot:spring-boot-starter-web')
3133
compile('org.springframework.boot:spring-boot-starter-aop')
3234
compile('com.alibaba:druid-spring-boot-starter:1.1.6')
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
#Fri May 11 12:58:07 CST 2018
12
distributionBase=GRADLE_USER_HOME
23
distributionPath=wrapper/dists
34
zipStoreBase=GRADLE_USER_HOME
45
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-bin.zip
6+
distributionUrl=https\://rdc-public-software.oss-cn-hangzhou.aliyuncs.com/gradle-4.1-bin.zip

src/main/java/cn/com/hellowood/dynamicdatasource/configuration/DataSourceConfigurer.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package cn.com.hellowood.dynamicdatasource.configuration;
22

33
import cn.com.hellowood.dynamicdatasource.common.DataSourceKey;
4-
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
54
import org.mybatis.spring.SqlSessionFactoryBean;
65
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
import org.springframework.boot.jdbc.DataSourceBuilder;
77
import org.springframework.context.annotation.Bean;
88
import org.springframework.context.annotation.Configuration;
99
import org.springframework.context.annotation.Primary;
10+
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
1011
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
1112
import org.springframework.transaction.PlatformTransactionManager;
1213

1314
import javax.sql.DataSource;
15+
import java.io.IOException;
1416
import java.util.HashMap;
1517
import java.util.Map;
1618

@@ -31,9 +33,9 @@ public class DataSourceConfigurer {
3133
*/
3234
@Bean("master")
3335
@Primary
34-
@ConfigurationProperties(prefix = "spring.datasource.druid.master")
36+
@ConfigurationProperties(prefix = "spring.datasource.hikari.master")
3537
public DataSource master() {
36-
return DruidDataSourceBuilder.create().build();
38+
return DataSourceBuilder.create().build();
3739
}
3840

3941
/**
@@ -42,9 +44,9 @@ public DataSource master() {
4244
* @return the data source
4345
*/
4446
@Bean("slaveAlpha")
45-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-alpha")
47+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-alpha")
4648
public DataSource slaveAlpha() {
47-
return DruidDataSourceBuilder.create().build();
49+
return DataSourceBuilder.create().build();
4850
}
4951

5052
/**
@@ -53,9 +55,9 @@ public DataSource slaveAlpha() {
5355
* @return the data source
5456
*/
5557
@Bean("slaveBeta")
56-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-beta")
58+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-beta")
5759
public DataSource slaveBeta() {
58-
return DruidDataSourceBuilder.create().build();
60+
return DataSourceBuilder.create().build();
5961
}
6062

6163
/**
@@ -64,9 +66,9 @@ public DataSource slaveBeta() {
6466
* @return the data source
6567
*/
6668
@Bean("slaveGamma")
67-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-gamma")
69+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-gamma")
6870
public DataSource slaveGamma() {
69-
return DruidDataSourceBuilder.create().build();
71+
return DataSourceBuilder.create().build();
7072
}
7173

7274
/**
@@ -109,8 +111,11 @@ public DataSource dynamicDataSource() {
109111
*/
110112
@Bean
111113
@ConfigurationProperties(prefix = "mybatis")
112-
public SqlSessionFactoryBean sqlSessionFactoryBean() {
114+
public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException {
113115
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
116+
// Here to config mybatis
117+
sqlSessionFactoryBean.setTypeAliasesPackage("cn.com.hellowood.dynamicdatasource.mapper");
118+
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("mappers/**Mapper.xml"));
114119
// Here is very important, if don't config this, will can't switch datasource
115120
// put all datasource into SqlSessionFactoryBean, then will autoconfig SqlSessionFactory
116121
sqlSessionFactoryBean.setDataSource(dynamicDataSource());

0 commit comments

Comments
 (0)