Skip to content

Commit 5638bf3

Browse files
author
何惠民
committed
Change datasource to Hikari
1 parent 30d54c2 commit 5638bf3

File tree

6 files changed

+87
-189
lines changed

6 files changed

+87
-189
lines changed

README.md

Lines changed: 41 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
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
1011

1112
> 以上分支都是基于 dev 分支修改或扩充而来,基本涵盖了常用的多数据源动态切换的方式,基本的原理都一样,都是通过切面根据不同的条件在执行数据库操作前切换数据源
1213
@@ -28,10 +29,9 @@
2829
## 添加依赖
2930
```groovy
3031
dependencies {
31-
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
32+
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
3233
compile('org.springframework.boot:spring-boot-starter-web')
3334
compile('org.springframework.boot:spring-boot-starter-aop')
34-
compile('com.alibaba:druid-spring-boot-starter:1.1.6')
3535
runtime('mysql:mysql-connector-java')
3636
testCompile('org.springframework.boot:spring-boot-starter-test')
3737
}
@@ -83,88 +83,40 @@ INSERT INTO product_slave_gamma.product (name, price) VALUES('slaveGamma', '1');
8383
- application.properties
8484

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

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

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

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

165-
# MyBatis config
166-
mybatis.type-aliases-package=cn.com.hellowood.dynamicdatasource.mapper
167-
mybatis.mapper-locations=mappers/**Mapper.xml
119+
spring.aop.proxy-target-class=true
168120
server.port=9999
169121
```
170122

@@ -215,7 +167,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
215167
package cn.com.hellowood.dynamicdatasource.configuration;
216168

217169
import org.mybatis.spring.SqlSessionFactoryBean;
218-
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
170+
import org.springframework.boot.jdbc.DataSourceBuilder;
219171
import org.springframework.boot.context.properties.ConfigurationProperties;
220172
import org.springframework.context.annotation.Bean;
221173
import org.springframework.context.annotation.Configuration;
@@ -238,9 +190,9 @@ public class DataSourceConfigurer {
238190
*/
239191
@Bean("master")
240192
@Primary
241-
@ConfigurationProperties(prefix = "spring.datasource.druid.master")
193+
@ConfigurationProperties(prefix = "spring.datasource.hikari.master")
242194
public DataSource master() {
243-
return DruidDataSourceBuilder.create().build();
195+
return DataSourceBuilder.create().build();
244196
}
245197

246198
/**
@@ -249,9 +201,9 @@ public class DataSourceConfigurer {
249201
* @return the data source
250202
*/
251203
@Bean("slaveAlpha")
252-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-alpha")
204+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-alpha")
253205
public DataSource slaveAlpha() {
254-
return DruidDataSourceBuilder.create().build();
206+
return DataSourceBuilder.create().build();
255207
}
256208

257209
/**
@@ -260,9 +212,9 @@ public class DataSourceConfigurer {
260212
* @return the data source
261213
*/
262214
@Bean("slaveBeta")
263-
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-beta")
215+
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave-beta")
264216
public DataSource slaveBeta() {
265-
return DruidDataSourceBuilder.create().build();
217+
return DataSourceBuilder.create().build();
266218
}
267219

268220
/**
@@ -273,7 +225,7 @@ public class DataSourceConfigurer {
273225
@Bean("slaveGamma")
274226
@ConfigurationProperties(prefix = "spring.datasource.druid.slave-gamma")
275227
public DataSource slaveGamma() {
276-
return DruidDataSourceBuilder.create().build();
228+
return DataSourceBuilder.create().build();
277229
}
278230

279231
/**
@@ -315,6 +267,10 @@ public class DataSourceConfigurer {
315267
@ConfigurationProperties(prefix = "mybatis")
316268
public SqlSessionFactoryBean sqlSessionFactoryBean() {
317269
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
270+
// 配置 MyBatis
271+
sqlSessionFactoryBean.setTypeAliasesPackage("cn.com.hellowood.dynamicdatasource.mapper");
272+
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("mappers/**Mapper.xml"));
273+
318274
// 配置数据源,此处配置为关键配置,如果没有将 dynamicDataSource 作为数据源则不能实现切换
319275
sqlSessionFactoryBean.setDataSource(dynamicDataSource());
320276
return sqlSessionFactoryBean;
@@ -346,18 +302,11 @@ import org.slf4j.LoggerFactory;
346302

347303
import java.util.ArrayList;
348304
import java.util.List;
349-
import java.util.concurrent.locks.Lock;
350-
import java.util.concurrent.locks.ReentrantLock;
351305

352306
public class DynamicDataSourceContextHolder {
353307

354308
private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
355309

356-
/**
357-
* 用于在切换数据源时保证不会被其他线程修改
358-
*/
359-
private static Lock lock = new ReentrantLock();
360-
361310
/**
362311
* 用于轮循的计数器
363312
*/
@@ -399,7 +348,6 @@ public class DynamicDataSourceContextHolder {
399348
* 当使用只读数据源时通过轮循方式选择要使用的数据源
400349
*/
401350
public static void useSlaveDataSource() {
402-
lock.lock();
403351

404352
try {
405353
int datasourceKeyIndex = counter % slaveDataSourceKeys.size();
@@ -409,9 +357,7 @@ public class DynamicDataSourceContextHolder {
409357
logger.error("Switch slave datasource failed, error message is {}", e.getMessage());
410358
useMasterDataSource();
411359
e.printStackTrace();
412-
} finally {
413-
lock.unlock();
414-
}
360+
}
415361
}
416362

417363
/**

build.gradle

Lines changed: 4 additions & 3 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,10 +27,10 @@ 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')
32-
compile('com.alibaba:druid-spring-boot-starter:1.1.6')
3334
runtime('mysql:mysql-connector-java')
3435
testCompile('org.springframework.boot:spring-boot-starter-test')
3536
}
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());

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
import java.util.ArrayList;
99
import java.util.List;
10-
import java.util.concurrent.locks.Lock;
11-
import java.util.concurrent.locks.ReentrantLock;
1210

1311
/**
1412
* Multiple DataSource Context Holder
@@ -21,8 +19,6 @@ public class DynamicDataSourceContextHolder {
2119

2220
private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
2321

24-
private static Lock lock = new ReentrantLock();
25-
2622
private static int counter = 0;
2723

2824
/**
@@ -61,8 +57,6 @@ public static void useMasterDataSource() {
6157
* Use slave data source.
6258
*/
6359
public static void useSlaveDataSource() {
64-
lock.lock();
65-
6660
try {
6761
int datasourceKeyIndex = counter % slaveDataSourceKeys.size();
6862
CONTEXT_HOLDER.set(String.valueOf(slaveDataSourceKeys.get(datasourceKeyIndex)));
@@ -71,8 +65,6 @@ public static void useSlaveDataSource() {
7165
logger.error("Switch slave datasource failed, error message is {}", e.getMessage());
7266
useMasterDataSource();
7367
e.printStackTrace();
74-
} finally {
75-
lock.unlock();
7668
}
7769
}
7870

0 commit comments

Comments
 (0)