DynamicDataSource.java
2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.eck.auto.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Configuration
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* 每次请求动态请求哪一个数据源
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
return DataSourceHolder.getDataSource();
}
public DynamicDataSource(){
Map<Object, Object> dataSources=new ConcurrentHashMap<>();
for(int i=1;i<=4;i++){
DataSource dataSource = druidDataSource(i);
dataSources.put(String.valueOf(i),dataSource);
if(i==1){
super.setDefaultTargetDataSource(dataSource);
}
}
super.setTargetDataSources(dataSources);
}
/**
* 此处数据库信配置,可以来源于redis等,然后再初始化所有数据源
* 重点说明:一个DruidDataSource数据源,它里面本身就是线程池了,
* 所以我们不需要考虑线程池的问题
* @param no
* @return
*/
public DataSource druidDataSource(int no) {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl("jdbc:mysql://localhost:3306/ds0"+no);
datasource.setUsername("root");
datasource.setPassword("123456");
datasource.setDriverClassName("com.mysql.jdbc.Driver");
datasource.setInitialSize(5);
datasource.setMinIdle(5);
datasource.setMaxActive(20);
//datasource.setDbType("com.alibaba.druid.pool.DruidDataSource");
datasource.setMaxWait(60000);
datasource.setTimeBetweenEvictionRunsMillis(60000);
datasource.setMinEvictableIdleTimeMillis(300000);
datasource.setValidationQuery("SELECT 1 FROM DUAL");
datasource.setTestWhileIdle(true);
datasource.setTestOnBorrow(false);
datasource.setTestOnReturn(false);
try {
datasource.setFilters("stat,wall,log4j");
} catch (SQLException e) {
e.printStackTrace();
}
return datasource;
}
}