Druid基本配置


最近公司要用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

有什么問題請大家指出,我會盡力修改完善。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM