7
7
- [ druid] ( https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/druid ) : 通过切面和注解方式实现的使用 Druid 连接池的动态数据源切换
8
8
- [ aspect_dao] ( https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/aspect_dao ) : 通过切面实现的 DAO 层的动态数据源切换
9
9
- [ roundrobin] ( https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/roundrobin ) : 通过切面使用轮询方式实现的只读数据源负载均衡
10
+ - [ hikari] ( https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/hikari ) : 升级到SpringBoot 2.0版本 数据源使用 Hikari
10
11
11
12
> 以上分支都是基于 dev 分支修改或扩充而来,基本涵盖了常用的多数据源动态切换的方式,基本的原理都一样,都是通过切面根据不同的条件在执行数据库操作前切换数据源
12
13
28
29
## 添加依赖
29
30
``` groovy
30
31
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 ')
32
33
compile('org.springframework.boot:spring-boot-starter-web')
33
34
compile('org.springframework.boot:spring-boot-starter-aop')
34
- compile('com.alibaba:druid-spring-boot-starter:1.1.6')
35
35
runtime('mysql:mysql-connector-java')
36
36
testCompile('org.springframework.boot:spring-boot-starter-test')
37
37
}
@@ -83,88 +83,40 @@ INSERT INTO product_slave_gamma.product (name, price) VALUES('slaveGamma', '1');
83
83
- application.properties
84
84
85
85
``` properties
86
+ spring.datasource.type =com.zaxxer.hikari.HikariDataSource
86
87
# 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
93
94
94
95
# 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
101
102
102
103
# 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
109
110
110
111
# 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
164
118
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
168
120
server.port =9999
169
121
```
170
122
@@ -215,7 +167,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
215
167
package cn.com.hellowood.dynamicdatasource.configuration ;
216
168
217
169
import org.mybatis.spring.SqlSessionFactoryBean ;
218
- import org.springframework.boot.autoconfigure. jdbc.DataSourceBuilder ;
170
+ import org.springframework.boot.jdbc.DataSourceBuilder ;
219
171
import org.springframework.boot.context.properties.ConfigurationProperties ;
220
172
import org.springframework.context.annotation.Bean ;
221
173
import org.springframework.context.annotation.Configuration ;
@@ -238,9 +190,9 @@ public class DataSourceConfigurer {
238
190
*/
239
191
@Bean (" master" )
240
192
@Primary
241
- @ConfigurationProperties (prefix = " spring.datasource.druid .master" )
193
+ @ConfigurationProperties (prefix = " spring.datasource.hikari .master" )
242
194
public DataSource master () {
243
- return DruidDataSourceBuilder . create(). build();
195
+ return DataSourceBuilder . create(). build();
244
196
}
245
197
246
198
/**
@@ -249,9 +201,9 @@ public class DataSourceConfigurer {
249
201
* @return the data source
250
202
*/
251
203
@Bean (" slaveAlpha" )
252
- @ConfigurationProperties (prefix = " spring.datasource.druid .slave-alpha" )
204
+ @ConfigurationProperties (prefix = " spring.datasource.hikari .slave-alpha" )
253
205
public DataSource slaveAlpha () {
254
- return DruidDataSourceBuilder . create(). build();
206
+ return DataSourceBuilder . create(). build();
255
207
}
256
208
257
209
/**
@@ -260,9 +212,9 @@ public class DataSourceConfigurer {
260
212
* @return the data source
261
213
*/
262
214
@Bean (" slaveBeta" )
263
- @ConfigurationProperties (prefix = " spring.datasource.druid .slave-beta" )
215
+ @ConfigurationProperties (prefix = " spring.datasource.hikari .slave-beta" )
264
216
public DataSource slaveBeta () {
265
- return DruidDataSourceBuilder . create(). build();
217
+ return DataSourceBuilder . create(). build();
266
218
}
267
219
268
220
/**
@@ -273,7 +225,7 @@ public class DataSourceConfigurer {
273
225
@Bean (" slaveGamma" )
274
226
@ConfigurationProperties (prefix = " spring.datasource.druid.slave-gamma" )
275
227
public DataSource slaveGamma () {
276
- return DruidDataSourceBuilder . create(). build();
228
+ return DataSourceBuilder . create(). build();
277
229
}
278
230
279
231
/**
@@ -315,6 +267,10 @@ public class DataSourceConfigurer {
315
267
@ConfigurationProperties (prefix = " mybatis" )
316
268
public SqlSessionFactoryBean sqlSessionFactoryBean () {
317
269
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean ();
270
+ // 配置 MyBatis
271
+ sqlSessionFactoryBean. setTypeAliasesPackage(" cn.com.hellowood.dynamicdatasource.mapper" );
272
+ sqlSessionFactoryBean. setMapperLocations(new PathMatchingResourcePatternResolver (). getResources(" mappers/**Mapper.xml" ));
273
+
318
274
// 配置数据源,此处配置为关键配置,如果没有将 dynamicDataSource 作为数据源则不能实现切换
319
275
sqlSessionFactoryBean. setDataSource(dynamicDataSource());
320
276
return sqlSessionFactoryBean;
@@ -346,18 +302,11 @@ import org.slf4j.LoggerFactory;
346
302
347
303
import java.util.ArrayList ;
348
304
import java.util.List ;
349
- import java.util.concurrent.locks.Lock ;
350
- import java.util.concurrent.locks.ReentrantLock ;
351
305
352
306
public class DynamicDataSourceContextHolder {
353
307
354
308
private static final Logger logger = LoggerFactory . getLogger(DynamicDataSourceContextHolder . class);
355
309
356
- /**
357
- * 用于在切换数据源时保证不会被其他线程修改
358
- */
359
- private static Lock lock = new ReentrantLock ();
360
-
361
310
/**
362
311
* 用于轮循的计数器
363
312
*/
@@ -399,7 +348,6 @@ public class DynamicDataSourceContextHolder {
399
348
* 当使用只读数据源时通过轮循方式选择要使用的数据源
400
349
*/
401
350
public static void useSlaveDataSource () {
402
- lock. lock();
403
351
404
352
try {
405
353
int datasourceKeyIndex = counter % slaveDataSourceKeys. size();
@@ -409,9 +357,7 @@ public class DynamicDataSourceContextHolder {
409
357
logger. error(" Switch slave datasource failed, error message is {}" , e. getMessage());
410
358
useMasterDataSource();
411
359
e. printStackTrace();
412
- } finally {
413
- lock. unlock();
414
- }
360
+ }
415
361
}
416
362
417
363
/**
0 commit comments