引言: 在Spring Boot下默認提供了若干種可用的連接池,Druid來自于阿里系的一個開源連接池,在連接池之外,還提供了非常優秀的監控功能,這里講解如何與Spring Boot實現集成。
1. 環境描述
spring Boot 1.4.0.RELEASE, JDK 1.8
2. Druid介紹
Druid是一個JDBC組件,它包括三部分:
- DruidDriver 代理Driver,能夠提供基于Filter-Chain模式的插件體系。
- DruidDataSource 高效可管理的數據庫連接池。
- SQLParser
Druid可以做什么?
可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對于線上分析數據庫訪問性能有幫助。
替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
SQL執行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter-Chain機制,很方便編寫JDBC層的擴展插件。
項目地址: https://github.com/alibaba/druid
3. Spring Boot與Druid的集成
MySQL Driver驅動包:
1
2
3
4
5
|
< dependency > < groupId >mysql</ groupId > < artifactId >mysql-connector-java</ artifactId > < scope >runtime</ scope > </ dependency > |
Spring Boot的JPA依賴包:
1
2
3
4
|
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-data-jpa</ artifactId > </ dependency > |
阿里系的Druid依賴包:
1
2
3
4
5
|
< dependency > < groupId >com.alibaba</ groupId > < artifactId >druid</ artifactId > < version >1.0.25</ version > </ dependency > |
Spring Boot中的application.properties配置信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 驅動配置信息 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url = jdbc:mysql://127.0.0.1:3306/mealsystem?useUnicode=true&characterEncoding=utf-8 spring.datasource.username = root spring.datasource.password = 123456 spring.datasource.driverClassName = com.mysql.jdbc.Driver #連接池的配置信息 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,wall,log4j spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 |
在Spring Boot1.4.0中驅動配置信息沒有問題,但是連接池的配置信息不再支持這里的配置項,即無法通過配置項直接支持相應的連接池;這里列出的這些配置項可以通過定制化DataSource來實現。
目前Spring Boot中默認支持的連接池有dbcp,dbcp2, tomcat, hikari三種連接池。
由于Druid暫時不在Spring Bootz中的直接支持,故需要進行配置信息的定制:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
@Configuration public class DruidDBConfig { private Logger logger = LoggerFactory.getLogger(DruidDBConfig. class ); @Value ( "${spring.datasource.url}" ) private String dbUrl; @Value ( "${spring.datasource.username}" ) private String username; @Value ( "${spring.datasource.password}" ) private String password; @Value ( "${spring.datasource.driverClassName}" ) private String driverClassName; @Value ( "${spring.datasource.initialSize}" ) private int initialSize; @Value ( "${spring.datasource.minIdle}" ) private int minIdle; @Value ( "${spring.datasource.maxActive}" ) private int maxActive; @Value ( "${spring.datasource.maxWait}" ) private int maxWait; @Value ( "${spring.datasource.timeBetweenEvictionRunsMillis}" ) private int timeBetweenEvictionRunsMillis; @Value ( "${spring.datasource.minEvictableIdleTimeMillis}" ) private int minEvictableIdleTimeMillis; @Value ( "${spring.datasource.validationQuery}" ) private String validationQuery; @Value ( "${spring.datasource.testWhileIdle}" ) private boolean testWhileIdle; @Value ( "${spring.datasource.testOnBorrow}" ) private boolean testOnBorrow; @Value ( "${spring.datasource.testOnReturn}" ) private boolean testOnReturn; @Value ( "${spring.datasource.poolPreparedStatements}" ) private boolean poolPreparedStatements; @Value ( "${spring.datasource.maxPoolPreparedStatementPerConnectionSize}" ) private int maxPoolPreparedStatementPerConnectionSize; @Value ( "${spring.datasource.filters}" ) private String filters; @Value ( "{spring.datasource.connectionProperties}" ) private String connectionProperties; @Bean //聲明其為Bean實例 @Primary //在同樣的DataSource中,首先使用被標注的DataSource public DataSource dataSource(){ DruidDataSource datasource = new DruidDataSource(); datasource.setUrl( this .dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (SQLException e) { logger.error( "druid configuration initialization filter" , e); } datasource.setConnectionProperties(connectionProperties); return datasource; } } |
DruidDBConfig類被@Configuration標注,用作配置信息; DataSource對象被@Bean聲明,為Spring容器所管理, @Primary表示這里定義的DataSource將覆蓋其他來源的DataSource。
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
|
# 下面為連接池的補充設置,應用到上面所有數據源中 # 初始化大小,最小,最大 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 配置獲取連接等待超時的時間 spring.datasource.maxWait=60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一個連接在池中最小生存的時間,單位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # 打開PSCache,并且指定每個連接上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻 spring.datasource.filters=stat,wall,log4j # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多個DruidDataSource的監控數據 #spring.datasource.useGlobalDataSourceStat=true |
需要注意的是:spring.datasource.type舊的spring boot版本是不能識別的。
配置StatView的Servlet:
Filter的實現類:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import com.alibaba.druid.support.http.WebStatFilter; @WebFilter (filterName= "druidWebStatFilter" ,urlPatterns= "/*" , initParams={ @WebInitParam (name= "exclusions" ,value= "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*" ) //忽略資源 } ) public class DruidStatFilter extends WebStatFilter { } |
StatViewServlet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import com.alibaba.druid.support.http.StatViewServlet; @WebServlet (urlPatterns= "/druid/*" , initParams={ @WebInitParam (name= "allow" ,value= "127.0.0.1,192.168.163.1" ), // IP白名單(沒有配置或者為空,則允許所有訪問) @WebInitParam (name= "deny" ,value= "192.168.1.73" ), // IP黑名單 (存在共同時,deny優先于allow) @WebInitParam (name= "loginUsername" ,value= "admin" ), // 用戶名 @WebInitParam (name= "loginPassword" ,value= "123456" ), // 密碼 @WebInitParam (name= "resetEnable" ,value= "false" ) // 禁用HTML頁面上的“Reset All”功能 }) public class DruidStatViewServlet extends StatViewServlet { private static final long serialVersionUID = -2688872071445249539L; } |
這兩個類相當于在web.xml中聲明了一個servlet, 等價于如下的配置信息(web.xml):
1
2
3
4
5
6
7
8
|
< servlet > < servlet-name >DruidStatView</ servlet-name > < servlet-class >com.alibaba.druid.support.http.StatViewServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >DruidStatView</ servlet-name > < url-pattern >/druid/*</ url-pattern > </ servlet-mapping > |
filter的配置信息:
1
2
3
4
5
6
7
8
9
10
11
12
|
< filter > < filter-name >DruidWebStatFilter</ filter-name > < filter-class >com.alibaba.druid.support.http.WebStatFilter</ filter-class > < init-param > < param-name >exclusions</ param-name > < param-value >*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >DruidWebStatFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
然后相應的配置工作就完成了,直接啟動即可看到相應的應用了。
4. 運行界面以及介紹
訪問地址: http://192.168.163.1:8080/druid/index.html
5. 參考資料
http://blog.csdn.net/xiaoyu411502/article/details/51392237
http://stackoverflow.com/questions/32833641/not-able-to-set-spring-datasource-type
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/blueheart20/article/details/52384032