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 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() 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());

‎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)

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