Druid是一個JDBC組件吠裆,它包括三部分:
1.DruidDriver 代理Driver按厘,能夠提供基于Filter-Chain模式的插件體系抵恋。
2.DruidDataSource 高效可管理的數(shù)據(jù)庫連接池。
3.SQLParser
Druid可以做什么
1.可以監(jiān)控數(shù)據(jù)庫訪問性能挠日,Druid內(nèi)置提供了一個功能強大的StatFilter
插件疮绷,能夠詳細統(tǒng)計SQL
的執(zhí)行性能,這對于線上分析數(shù)據(jù)庫訪問性能有幫助嚣潜。
2.替換DBCP和C3P0冬骚。Druid提供了一個高效、功能強大懂算、可擴展性好的數(shù)據(jù)庫連接池只冻。
3.數(shù)據(jù)庫密碼加密。直接把數(shù)據(jù)庫密碼寫在配置文件中计技,這是不好的行為喜德,容易導(dǎo)致安全問題。DruidDruiver
和DruidDataSource
都支持PasswordCallback
垮媒。
4.SQL執(zhí)行日志舍悯,Druid提供了不同的LogFilter
,能夠支持Common-Logging涣澡、Log4j和JdkLog
贱呐,你可以按需要選擇相應(yīng)的LogFilter
丧诺,監(jiān)控你應(yīng)用的數(shù)據(jù)庫訪問情況入桂。
擴展JDBC,如果你要對JDBC層有編程的需求驳阎,可以通過Druid提供的Filter-Chain
機制抗愁,很方便編寫JDBC層的擴展插件馁蒂。
Springboot中的連接池
目前Spring Boot中默認支持的連接池有dbcp
,dbcp2
, tomcat
, hikariCP
。
Druid連接池可以通過定制化DataSource
來實現(xiàn)
功能 | dbcp | druid | c3p0 | tomcat-jdbc | HikariCP |
---|---|---|---|---|---|
是否支持PSCache | 是 | 是 | 是 | 否 | 否 |
監(jiān)控 | jmx | jmx/log/http | jmx,log | jmx | jmx |
擴展性 | 弱 | 好 | 弱 | 弱 | 弱 |
sql攔截及解析 | 無 | 支持 | 無 | 無 | 無 |
代碼 | 簡單 | 中等 | 復(fù)雜 | 簡單 | 簡單 |
特點 | 依賴于common-pool | 阿里開源蜘腌,功能全面 | 歷史久遠沫屡,代碼邏輯復(fù)雜,且不易維護 | 優(yōu)化力度大撮珠,功能簡單沮脖,起源于boneCP | |
連接池管理 | LinkedBlockingDeque | 數(shù)組 | FairBlockingQueue | threadlocal+CopyOnWriteArrayList |
更多詳細的介紹可以參考http://www.iteye.com/magazines/90
開發(fā)文檔地址:http://tool.oschina.net/apidocs/apidoc?api=druid0.26
屬性(Parameter) | 默認值(Default) | 描述(Description) |
---|---|---|
username | 連接數(shù)據(jù)庫的用戶名 | |
password | 連接數(shù)據(jù)庫的密碼 | |
jdbcUrl | 同DBCP中的jdbcUrl屬性 | |
driverClassName | 根據(jù)url自動識別 | 這一項可配可不配,如果不配置druid會根據(jù)url自動識別dbType芯急,然后選擇相應(yīng)的driverClassName |
initialSize | 0 | 初始化時建立物理連接的個數(shù)勺届。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時 初始化連接:連接池啟動時創(chuàng)建的初始化連接數(shù)量 |
maxActive | 8 | 最大連接池數(shù)量(Maximum number of Connections a pool will maintain at any given time.) *參見DBCP中的maxTotal屬性 |
maxIdle | 8 | 已經(jīng)不再使用娶耍,配置了也沒效果 *參見DBCP中的maxIdle屬性 |
minIdle | 最小連接池數(shù)量 | |
maxWait | 獲取連接時最大等待時間免姿,單位毫秒。配置了maxWait之后榕酒,缺省啟用公平鎖胚膊,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖想鹰。 | |
poolPreparedState- ments | false | 是否緩存preparedStatement紊婉,也就是PSCache。PSCache對支持游標的數(shù)據(jù)庫性能提升巨大辑舷,比如說oracle肩榕。 |
maxOpenPrepared- Statements | -1 | 要啟用PSCache,必須配置大于0惩妇,當(dāng)大于0時株汉,poolPreparedStatements自動觸發(fā)修改為true。 在Druid中歌殃,不會存在Oracle下PSCache占用內(nèi)存過多的問題乔妈,可以把這個數(shù)值配置大一些,比如說100 |
testOnBorrow | true | 申請連接時執(zhí)行validationQuery檢測連接是否有效氓皱,做了這個配置會降低性能路召。 |
testOnReturn | false | 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能 |
testWhileIdle | false | 建議配置為true波材,不影響性能股淡,并且保證安全性。申請連接的時候檢測廷区,如果空閑時間大于timeBetweenEvictionRunsMillis唯灵,執(zhí)行validationQuery檢測連接是否有效。 |
validationQuery | 用來檢測連接是否有效的sql隙轻,要求是一個查詢語句埠帕。如果validationQuery為null垢揩,testOnBorrow、testOnReturn敛瓷、 testWhileIdle都不會其作用叁巨。在mysql中通常為select 'x',在oracle中通常為select 1 from dual | |
timeBetweenEviction-RunsMillis | 1) Destroy線程會檢測連接的間隔時間 2) testWhileIdle的判斷依據(jù) | |
minEvictableIdle- TimeMillis | Destory線程中如果檢測到當(dāng)前連接的最后活躍時間和當(dāng)前時間的差值大于minEvictableIdleTimeMillis呐籽,則關(guān)閉當(dāng)前連接锋勺。 | |
removeAbandoned | 對于建立時間超過removeAbandonedTimeout的連接強制關(guān)閉 | |
removeAbandoned-Timeout | 指定連接建立多長時間就需要被強制關(guān)閉 | |
logAbandoned | false | 指定發(fā)生removeabandoned的時候,是否記錄當(dāng)前線程的堆棧信息到日志中 |
filters | 屬性類型是字符串狡蝶,通過別名的方式配置擴展插件宙刘,常用的插件有: 1)監(jiān)控統(tǒng)計用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall |
在springboot中使用Druid的話首先第一步肯定是先引入依賴
版本1.0.29((Mar 14, 2017))
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
由于Druid暫時不在Spring Boot中的直接支持,故需要進行配置信息的定制
1.把配置信息寫在yml配置文件中
spring:
# DATASOURCE
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/所用到的數(shù)據(jù)庫名?useUnicode=true&characterEncoding=utf-8
username: mysql數(shù)據(jù)庫用戶名
password: mysql數(shù)據(jù)庫密碼
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
useGlobalDataSourceStat: true
2.配置數(shù)據(jù)源牢酵。
@ConfigurationProperties
會把配置文件的參數(shù)自動賦值到dataSource里
druidStatViewServlet()
配置監(jiān)控界面
druidWebStatViewFilter()
編寫過濾器悬包,配合druid
監(jiān)控的使用
@Configuration
public class DruidConfiguration {
private Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
@Bean
public ServletRegistrationBean druidStatViewServlet() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
registrationBean.addInitParameter("allow", "127.0.0.1");// IP白名單 (沒有配置或者為空,則允許所有訪問)
registrationBean.addInitParameter("deny", "");// IP黑名單 (存在共同時馍乙,deny優(yōu)先于allow)
registrationBean.addInitParameter("loginUsername", "登錄druid的用戶名");
registrationBean.addInitParameter("loginPassword", "登錄druid的密碼");
registrationBean.addInitParameter("resetEnable", "false");
return registrationBean;
}
@Bean
public FilterRegistrationBean druidWebStatViewFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new WebStatFilter());
registrationBean.addInitParameter("urlPatterns", "/*");
registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
return registrationBean;
}
}
在注入的兩個bean中布近,一個是StatViewServlet()
,一個是WebStatFilter()
StatViewServlet
是一個標準的javax.servlet.http.HttpServlet
1.配置url-pattern
根據(jù)配置中的url-pattern
來訪問內(nèi)置監(jiān)控頁面丝格,如果是上面的配置/druid/*
撑瞧,內(nèi)置監(jiān)控頁面的首頁是/druid/index.html
2配置allow和deny
判斷規(guī)則:
deny優(yōu)先于allow,如果在deny列表中显蝌,就算在allow列表中预伺,也會被拒絕。
如果allow沒有配置或者為空曼尊,則允許所有訪問
其中
128.242.127.1/24
24表示酬诀,前面24位是子網(wǎng)掩碼,比對的時候骆撇,前面24位相同就匹配瞒御。
不支持IPV6
由于匹配規(guī)則不支持IPV6,配置了allow或者deny之后神郊,會導(dǎo)致IPV6無法訪問肴裙。
3.配置resetEnable
在StatViewSerlvet
輸出的html頁面中,有一個功能是Reset All
涌乳,執(zhí)行這個操作之后蜻懦,會導(dǎo)致所有計數(shù)器清零,重新計數(shù)夕晓。你可以通過配置參數(shù)關(guān)閉它宛乃。
WebStatFilter
用于采集web-jdbc
關(guān)聯(lián)監(jiān)控的數(shù)據(jù)。
exlusions
配置
經(jīng)常需要排除一些不必要的url,比如js
,css
等等烤惊。配置在init-param
中乔煞。
啟動項目后訪問http://localhost:8080/druid/index.html 登錄后
即可查看數(shù)據(jù)源及SQL統(tǒng)計等吁朦。
如果是被deny
的IP 127.0.0.1
登錄druid
是這樣的柒室,但是換成localhost
的話是可以的