Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 133cf59

Browse files
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() throwsIOException{
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)

AltStyle によって変換されたページ (->オリジナル) /