數據庫鏈接池Druid的介紹,配置分析對比總結

Druid的簡介

Druid首先是一個數據庫鏈接池。Druid是目前最好的數據庫鏈接池,在功能、性能、擴展性方面,都超過其餘數據庫鏈接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,通過一年多生產環境大規模部署的嚴苛考驗。Druid是阿里巴巴開發的號稱爲監控而生的數據庫鏈接池!css

Druid的功能

一、替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫鏈接池。html

二、能夠監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,可以詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。mysql

三、數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是很差的行爲,容易致使安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。git

四、SQL執行日誌,Druid提供了不一樣的LogFilter,可以支持Common-Logging、Log4j和JdkLog,你能夠按須要選擇相應的LogFilter,監控你應用的數據庫訪問狀況。github

五、擴展JDBC,若是你要對JDBC層有編程的需求,能夠經過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。web

因此Druid能夠: 一、充當數據庫鏈接池。 二、能夠監控數據庫訪問性能 三、得到SQL執行日誌spring

工程配置以下:

一、工程引入druid-1.0.15.jarsql

<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid-version}</version>
    </dependency>
複製代碼

二、數據源配置數據庫

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
    <property value="${jdbc_url}" name="url"></property>  
    <property value="${jdbc_user}" name="username"></property>  
    <property value="${jdbc_password}" name="password"></property>  
   
    <property value="stat" name="filters"></property>  
   
    <property value="20" name="maxActive"></property>  
    <property value="1" name="initialSize"></property>  
    <property value="60000" name="maxWait"></property>  
    <property value="1" name="minIdle"></property>  
   
    <property value="60000" name="timeBetweenEvictionRunsMillis"></property>  
    <property value="300000" name="minEvictableIdleTimeMillis"></property>  
   
    <property value="SELECT 'x'" name="validationQuery"></property>  
    <property value="true" name="testWhileIdle"></property>  
    <property value="false" name="testOnBorrow"></property>  
    <property value="false" name="testOnReturn"></property>  
    <property value="true" name="poolPreparedStatements"></property>  
    <property value="20" name="maxPoolPreparedStatementPerConnectionSize"></property>  
</bean> 
複製代碼
配置 缺省值 說明
name   配置這個屬性的意義在於,若是存在多個數據源,監控的時候
能夠經過名字來區分開來。若是沒有配置,將會生成一個名字,
格式是:」DataSource-」 + System.identityHashCode(this)
jdbcUrl   鏈接數據庫的url,不一樣數據庫不同。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2 
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username   鏈接數據庫的用戶名
password   鏈接數據庫的密碼。若是你不但願密碼直接寫在配置文件中,
可使用ConfigFilter。詳細看這裏:
github.com/alibaba/dru…
driverClassName 根據url自動識別 這一項可配可不配,若是不配置druid會根據url自動識別dbType,
而後選擇相應的driverClassName
initialSize 0 初始化時創建物理鏈接的個數。初始化發生在顯示調用init方法,
或者第一次getConnection時
maxActive 8 最大鏈接池數量
maxIdle 8 已經再也不使用,配置了也沒效果
minIdle   最小鏈接池數量
maxWait   獲取鏈接時最大等待時間,單位毫秒。配置了maxWait以後,
缺省啓用公平鎖,併發效率會有所降低,
若是須要能夠經過配置useUnfairLock屬性爲true使用非公平鎖。
poolPreparedStatements false 是否緩存preparedStatement,也就是PSCache。
PSCache對支持遊標的數據庫性能提高巨大,好比說oracle。
在mysql5.5如下的版本中沒有PSCache功能,建議關閉掉。
5.5及以上版本有PSCache,建議開啓。
maxOpenPreparedStatements -1 要啓用PSCache,必須配置大於0,當大於0時,
poolPreparedStatements自動觸發修改成true。
在Druid中,不會存在Oracle下PSCache佔用內存過多的問題,
能夠把這個數值配置大一些,好比說100
validationQuery   用來檢測鏈接是否有效的sql,要求是一個查詢語句。
若是validationQuery爲null,testOnBorrow、testOnReturn、
testWhileIdle都不會其做用。
testOnBorrow true 申請鏈接時執行validationQuery檢測鏈接是否有效,
作了這個配置會下降性能。
testOnReturn false 歸還鏈接時執行validationQuery檢測鏈接是否有效,
作了這個配置會下降性能
testWhileIdle false 建議配置爲true,不影響性能,而且保證安全性。
申請鏈接的時候檢測,若是空閒時間大於
timeBetweenEvictionRunsMillis,
執行validationQuery檢測鏈接是否有效。
timeBetweenEvictionRunsMillis   有兩個含義:
1) Destroy線程會檢測鏈接的間隔時間
 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
numTestsPerEvictionRun   再也不使用,一個DruidDataSource只支持一個EvictionRun
minEvictableIdleTimeMillis    
connectionInitSqls   物理鏈接初始化的時候執行的sql
exceptionSorter 根據dbType自動識別 當數據庫拋出一些不可恢復的異常時,拋棄鏈接
filters   屬性類型是字符串,經過別名的方式配置擴展插件,
經常使用的插件有:
監控統計用的filter:stat 
日誌用的filter:log4j
 防護sql注入的filter:wall
proxyFilters   類型是List<com.alibaba.druid.filter.Filter>,
若是同時配置了filters和proxyFilters,
是組合關係,並不是替換關係

三、Web.xml配置apache

<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>
複製代碼

至此基本配置完成,能夠查看內置監控頁面了,路徑是/druid/index.html, 完整路徑是http://127.0.0.1:8080/druid/index.html 若是還須要使用Web應用、URI監控、Session監控、Spring監控等則還須要繼續增長配置。

四、Wen應用配置 WebStatFilter用於採集web-jdbc關聯監控的數據

在Web.xml中增長配置,就可使用Web應用、URI監控、Session監控等功能

<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>
    <init-param>
    	<param-name>profileEnable</param-name>
    	<param-value>true</param-value>
	</init-param>
	<init-param>
        <param-name>principalCookieName</param-name>
        <param-value>USER_COOKIE</param-value>
    </init-param>
    <init-param>
        <param-name>principalSessionName</param-name>
        <param-value>USER_SESSION</param-value>
    </init-param>
</filter>

<filter-mapping>
 <filter-name>DruidWebStatFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
複製代碼

五、Spring監控配置 在Spring配置文件中增長

<bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
    </bean>
<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">
   <property name="patterns">
       <list>
           <value>com.company.bussines.service.*</value>
           <value>com.company.bussines.dao.*</value>
       </list>
   </property>
</bean>

<aop:config proxy-target-class="true">
   <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" />
</aop:config>
複製代碼

全部配置完成。


1. Druid是什麼?

Druid是Java語言中最好的數據庫鏈接池。Druid可以提供強大的監控和擴展功能。

2. 在哪裏下載druid

3. 怎麼獲取Druid的源碼

Druid是一個開源項目,源碼託管在github上,源代碼倉庫地址是 github.com/alibaba/dru…。同時每次Druid發佈正式版本和快照的時候,都會把源碼打包,你能夠從上面的下載地址中找到相關版本的源碼

4. 怎麼配置maven

Druid 0.1.18 以後版本都發布到maven中央倉庫中,因此你只須要在項目的pom.xml中加上dependency就能夠了。例如:

<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid-version}</version>
    </dependency>
複製代碼

也能夠選擇 Maven倉庫查找公共的倉庫地址:www.mvnrepository.com/artifact/co…

5. 怎麼打開Druid的監控統計功能

Druid的監控統計功能是經過filter-chain擴展實現,若是你要打開監控統計功能,配置StatFilter,具體看這裏:github.com/alibaba/dru…

6. 怎樣使用Druid的內置監控頁面

內置監控頁面是一個Servlet,具體配置看這裏:github.com/alibaba/dru…

7. 內置監控中的Web和Spring關聯監控怎麼配置?

8. 怎麼配置防護SQL注入攻擊

Druid提供了WallFilter,它是基於SQL語義分析來實現防護SQL注入攻擊的。具體配置看這裏:github.com/alibaba/dru…

9. Druid有沒有參考配置

不一樣的業務場景需求不一樣,你可使用咱們的參考配置,但建議你仔細閱讀相關文檔,瞭解清楚以後作定製配置。github.com/alibaba/dru…

10. 我想日誌記錄JDBC執行的SQL,如何配置

Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這裏github.com/alibaba/dru…

11. 個人程序可能產生鏈接泄漏了,有什麼辦法?

Druid提供了多種監測鏈接泄漏的手段,具體看這裏:github.com/alibaba/dru…

12. 在Druid中使用PSCache會有內存佔用過大問題麼?

鏈接Oracle數據庫,打開PSCache,在其餘的數據庫鏈接池都會存在內存佔用過多的問題,Druid是惟一解決這個問題的鏈接池。具體看這裏:github.com/alibaba/dru…

13. 有沒有和其餘數據庫鏈接池的對比?

14. 從其餘鏈接池遷移要注意什麼?

15. Druid中有沒有相似Jboss DataSource中的ExceptionSorter

ExceptionSorter是JBoss DataSource中的優秀特性,Druid也有同樣功能的ExceptionSorter,但不用手動配置,自動識別生效的。具體看這裏:github.com/alibaba/dru…

16. Druid中的maxIdle爲何是沒用的?

maxIdle是Druid爲了方便DBCP用戶遷移而增長的,maxIdle是一個混亂的概念。鏈接池只應該有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分別至關於maxPoolSize和minPoolSize。

17. 個人應用配置的是JNDI數據源,能夠用DruidDataSource麼?

DruidDataSource支持JNDI配置,具體看這裏:github.com/alibaba/dru… 
具體實現的類是這個:com.alibaba.druid.pool.DruidDataSourceFactory,你能夠閱讀代碼加深理解。

18. 個人應用已使用DBCP,是代碼中寫死的,怎樣更換爲Druid?

能夠的,Druid提供了一箇中徹底平滑遷移DBCP的辦法。

  • 1) 從repo1.maven.org/maven2/com/… 下載druid-wrapper-xxx.jar 
  • 2) 加入druid-xxx.jar 
  • 3) 從你的WEB-INF/lib/中刪除dbcp-xxx.jar 
  • 4) 按須要加上配置,好比JVM啓動參數加上-Ddruid.filters=stat,動態配置druid的filters 

這種用法,使得能夠在一些非本身開發的應用中使用Druid,例如在sonar中部署druid,sonar是一個使用jruby開發的web應用,寫死了DBCP,只可以經過這種方法來更換。

19. 我想試用快照版本,怎麼獲取?

直接獲取快照版本的地址是:code.alibabatech.com/mvn/snapsho… ,使用快照版本建議加入咱們QQ羣 92748305,遇到問題直接反饋給咱們。

20. 有一些SQL執行很慢,我但願日誌記錄下來,怎麼設置?

在StatFilter配置中有慢SQL執行日誌記錄,看這裏github.com/alibaba/dru…

21. 我但願加密個人數據庫密碼怎麼辦?

運維和DBA都不但願把密碼明文直接寫在配置文件中,Druid提供了數據庫祕密加密的功能。具體看這裏:github.com/alibaba/dru…

22. 如何參與Druid的開發

Druid是一個經過github開源的項目,github的特性,使得你很容易參與其中。這裏有詳細說明github.com/alibaba/dru…

23. Druid的發佈週期是怎樣?

Druid是一個活躍的項目,長期維護。每月有一個發佈窗口,除非遇到重大bug和很是緊急的需求,不然都是每月最多發佈一次。若是沒有足夠多的需求,發佈窗口就不會被使用。

24. 若是DruidDataSource在init的時候失敗了,再也不使用,是否須要close

是的,若是DruidDataSource再也不使用,必須調用close來釋放資源,釋放的資源包括關閉Create和Destory線程。

25. DruidDataSource支持哪些數據庫?

理論上說,支持全部有jdbc驅動的數據庫。實際測試過的有

數據庫 支持狀態
mysql 支持,大規模使用
oracle 支持,大規模使用
sqlserver 支持
postgres 支持
db2 支持
h2 支持
derby 支持
sqlite 支持
sybase 支持

26. Oracle下jdbc executeBatch時,更新行數計算不正確

使用jdbc的executeBatch 方法,若是數據庫爲oracle,則不管是否成功更新到數據,返回值都是-2,而不是真正被sql更新到的記錄數,這是Oracle JDBC Driver的問題,Druid不做特殊處理。

27. Druid如何自動根據URL自動識別DriverClass的

Druid是根據url前綴來識別DriverClass的,這樣使得配置更方便簡潔。

前綴 DriverCLass 描述信息
jdbc:odps com.aliyun.odps.jdbc.OdpsDriver  
jdbc:derby org.apache.derby.jdbc.EmbeddedDriver  
jdbc:mysql com.mysql.jdbc.Driver  
jdbc:oracle oracle.jdbc.driver.OracleDriver  
jdbc:microsoft com.microsoft.jdbc.sqlserver.SQLServerDriver  
jdbc:sybase:Tds com.sybase.jdbc2.jdbc.SybDriver  
jdbc:jtds net.sourceforge.jtds.jdbc.Driver  
jdbc:postgresql org.postgresql.Driver  
jdbc:fake com.alibaba.druid.mock.MockDriver  
jdbc:mock com.alibaba.druid.mock.MockDriver  
jdbc:hsqldb org.hsqldb.jdbcDriver  
jdbc:db2 COM.ibm.db2.jdbc.app.DB2Driver DB2的JDBC Driver十分混亂,這個匹配不必定對
jdbc:sqlite org.sqlite.JDBC  
jdbc:ingres com.ingres.jdbc.IngresDriver  
jdbc:h2 org.h2.Driver  
jdbc:mckoi com.mckoi.JDBCDriver  
jdbc:cloudscape COM.cloudscape.core.JDBCDriver  
jdbc:informix-sqli com.informix.jdbc.IfxDriver  
jdbc:timesten com.timesten.jdbc.TimesTenDriver  
jdbc:as400 com.ibm.as400.access.AS400JDBCDriver  
jdbc:sapdb com.sap.dbtech.jdbc.DriverSapDB  
jdbc:JSQLConnect com.jnetdirect.jsql.JSQLDriver  
jdbc:JTurbo com.newatlanta.jturbo.driver.Driver  
jdbc:firebirdsql org.firebirdsql.jdbc.FBDriver  
jdbc:interbase interbase.interclient.Driver  
jdbc:pointbase com.pointbase.jdbc.jdbcUniversalDriver  
jdbc:edbc ca.edbc.jdbc.EdbcDriver  
jdbc:mimer:multi1 com.mimer.jdbc.Driver  

28. 如何保存監控記錄

github.com/alibaba/dru…

29. 我想Log輸出SQL執行的信息怎麼辦?

github.com/alibaba/dru…

30. 如何配置Druid內置的log實現

github.com/alibaba/dru…

 

附:示例項目:

github.com/windwant/sp…
https://github.com/windwant/spring-boot-service.git
https://github.com/windwant/spring-cloud-service.git
相關文章
相關標籤/搜索