最近公司要用Druid 所以看了下基本配置及配置過程中出現的問題
Druid是什么?
Druid是阿里巴巴開源平台上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日志監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池,據說是目前最好的連接池druid功能最為全面,sql攔截等功能,統計數據較為全面,具有良好的擴展性。
為什么要選druid,主流Java數據庫連接池分析
C3p0: 開源的JDBC連接池,實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標准擴展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用於小型系統,代碼600KB左右。
DBCP (Database Connection Pool):由Apache開發的一個Java數據庫連接池項目, Jakarta commons-pool對象池機制,Tomcat使用的連接池組件就是DBCP。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar,預先將數據庫連接放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完再放回。單線程,並發量低,性能不好,適用於小型系統。
Jdbc :Tomcat在7.0以前都是使用common-dbcp做為連接池組件,但是dbcp是單線程,為保證線程安全會鎖整個連接池,性能較差,dbcp有超過60個類,也相對復雜。
BoneCP: BoneCP是一個高效、免費、開源的Java數據庫連接池實現庫。設計初衷就是為了提高數據庫連接池性能,根據某些測試數據顯示,BoneCP的速度是最快的,要比當時第二快速的連接池快25倍左右,完美集成到一些持久化產品如Hibernate和DataNucleus中。BoneCP特色:高度可擴展,快速;連接狀態切換的回調機制;允許直接訪問連接;自動化重置能力;JMX支持;懶加載能力;支持XML和屬性文件配置方式;較好的Java代碼組織,100%單元測試分支代碼覆蓋率;代碼40KB左右。
Druid:Druid是Java語言中最好的數據庫連接池,Druid能夠提供強大的監控和擴展功能,是一個可用於大數據實時查詢和分析的高容錯、高性能的開源分布式系統,尤其是當發生代碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid仍能夠保持100%正常運行。主要特色:為分析監控設計;快速的交互式查詢;高可用;可擴展;Druid是一個開源項目,源碼托管在github上。Ps:https://github.com/alibaba/druid
Druid簡單使用
Druid是一個JDBC組件,它包括三個部分:
基於Filter-Chain模式的插件體系。
DruidDataSource :高效可管理的數據庫連接池。
SQLParser :sql語句解析器
Maven依賴(最新版本v1.1.20)
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>
Application配置文件配置
配置文件配置可選properties和yml兩種
# 數據庫訪問配置
# 主數據源,默認的
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/druid?serverTimezone=GMT&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# 下面為連接池的補充設置,應用到上面所有數據源中
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 配置獲取連接等待超時的時間
spring.datasource.druid.max-wait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
#用來檢測連接是否有效的sql,要求是一個查詢語句。
#如果validationQuery為null,testOnBorrow、testOnReturn、
#testWhileIdle都不會其作用。
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
#建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於
#timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
spring.datasource.druid.test-while-idle=true
#申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
spring.datasource.druid.test-on-borrow=false
#歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
spring.datasource.druid.test-on-return=false
# 打開PSCache,並且指定每個連接上PSCache的大小
spring.datasource.druid.pooling-connection-info=true
#是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
spring.datasource.druid.filters=stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
Druid過濾器配置
DruidFilter 有兩種配置 一種是直接使用javax的@WebFilter注解格式
/**
* Druid過濾器.
* @author Administrator
*/
@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",
initParams={
@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略資源
}
)
public class DruidFilter extends WebStatFilter{
}
第二種使用spring的FilterRegistrationBean選擇其一即可
public class DruidFilter {
@Bean
public FilterRegistrationBean druidStatFilter2() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加過濾規則.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
DruidServlet配置
DruidServlet有兩種配置 一種是直接使用javax的@WebFilter注解格式
/**
* druid數據源狀態監控.
* @author Administrator
*
*/
@WebServlet(urlPatterns="/druid/*",
initParams={
@WebInitParam(name="allow",value=""),// IP白名單(沒有配置或者為空,則允許所有訪問)
@WebInitParam(name="deny",value="192.168.1.73"),// IP黑名單 (存在共同時,deny優先於allow)
@WebInitParam(name="loginUsername",value="admin"),// 用戶名
@WebInitParam(name="loginPassword",value="admin"),// 密碼
@WebInitParam(name="resetEnable",value="false")// 禁用HTML頁面上的“Reset All”功能
}
)
public class DruidServlet extends StatViewServlet
{
private static final long serialVersionUID = 1L;
}
第二種使用spring的ServletRegistrationBean 來注冊servlet選擇其一即可
@Bean
public ServletRegistrationBean DruidStatViewServle2() {
//org.springframework.boot.context.embedded.ServletRegistrationBean提供類的進行注冊.
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
//添加初始化參數:initParams
//白名單:
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
//IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
//登錄查看信息的賬號密碼.
servletRegistrationBean.addInitParameter("loginUsername", "admin2");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
//是否能夠重置數據.
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
**在StatViewSerlvet輸出的html頁面中,有一個功能是Reset All,執行這個操作之后,會導致所有計數器清零,重新計數。所以一般都設置關閉。
監控配置好后可直接訪問
http://loaclhost:port/projectname/druid/index.html
上述配置可直接改為yml配置即:
<!-- 直接使用druid可能會導致配置文件不生效沒有提示建議使用-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>druid-spring-boot-starter</artifactId>-->
<!-- <version>1.1.10</version>-->
<!-- </dependency>-->
spring:
# 配置數據庫信息
datasource:
druid:
# 數據源配置
username: root
password: root
url: jdbc:mysql://localhost:3306/druid?serverTimezone=GMT&useSSL=false # 設置時區
driver-class-name: com.mysql.cj.jdbc.Driver
# 初始化 最小 最大
initial-size: 5
min-idle: 5
max-active: 300
# 配置獲取連接等待超時的時間
max-wait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x' #用來檢測連接是否有效的sql,要求是一個查詢語句,配置為null則
test-while-idle: true #建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,空閑時間大於間隔檢測時間,執行檢測連接是否有效
test-on-borrow: false #申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
test-on-return: false #歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
# 開啟PSCache,並且指定每個連接上PSCache的大小,PSCache對支持游標的數據庫性能提升巨大,比如oracle。在mysql下建議關閉
poolPreparedStatements: false
#值大於0默認開啟cache,數據庫緩存,同一條sql匹配cache,
#mysql的cache功能只適用於下列場合:數據變動較少,select較多的table
maxPoolPreparedStatementPerConnectionSize: 100
# 配置多個英文逗號分隔
filters: stat,wall,log4j
# WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
# 啟用StatFilter默認值true
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: false
session-stat-max-count: 1000
# principal-cookie-name: admin
# principal-session-name: admin
profile-enable: true
# http://loacalhsot:8080/druid/index.html
stat-view-servlet:
url-pattern: /druid/* # 監控頁面訪問路徑
reset-enable: false # 不允許清空統計數據
login-username: admin #用戶名
login-password: admin #密碼
allow: "" # 白名單
deny: 192.168.1.244 #黑名單 優先級deny>allow
#缺省多個DruidDataSource的監控數據是各自獨立的,支持配置公用監控數據合並數據源。
use-global-data-source-stat: true
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=20
filter:
log4j:
enabled: true
stat:
log-slow-sql: true
server:
port: 8080
即可直接訪問監控頁面 http://localhost:8080/druid/sql.html
FAQ:
1. druid是通過配置Filter攔截JDBC的方法調用,防止sql注入也是在JDBC最低層進行攔截做判斷,不會遺漏。
2. 只有配置filter才能打卡i監控功能,配置servlet才能調用監控頁面
3. 數據源不顯示,是配置文件statfilter配置沒有生效。
4.Druid不依賴任何的log組件,但支持多種log組件,會根據檢測當前環境,選擇一種合適的log實現,可記錄sql日志。
5理論上說,支持所有有jdbc驅動的數據庫。
6.如果不適用spring自動加載datasource,sql則無法被監控
7.日志不打印,則druid需要看druid默認的日志和spring日志是否沖突
8.druid 慢sql不打印ylm默認不開啟需要手動在statfilter開啟log過濾器和注解打印
filter:
log4j:
enabled: true
stat:
log-slow-sql: true
9.
更新地址https://github.com/alibaba/druid
有什么問題請大家指出,我會盡力修改完善。