數(shù)據(jù)庫連接池Druid的介紹,配置分析對比總結(jié)

Druid的簡介

Druid首先是一個數(shù)據(jù)庫連接池。Druid是目前最好的數(shù)據(jù)庫連接池,在功能、性能、擴展性方面,都超過其他數(shù)據(jù)庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經(jīng)在阿里巴巴部署了超過600個應(yīng)用,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗。Druid是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數(shù)據(jù)庫連接池!

Druid的功能

1、替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數(shù)據(jù)庫連接池。

2、可以監(jiān)控數(shù)據(jù)庫訪問性能,Druid內(nèi)置提供了一個功能強大的StatFilter插件,能夠詳細統(tǒng)計SQL的執(zhí)行性能,這對于線上分析數(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ù)庫訪問情況。

5、擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。

所以Druid可以:
1、充當(dāng)數(shù)據(jù)庫連接池。
2、可以監(jiān)控數(shù)據(jù)庫訪問性能
3、獲得SQL執(zhí)行日志

工程配置如下:

1、工程引入druid-1.0.15.jar

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid-version}</version>
    </dependency>

2、數(shù)據(jù)源配置

<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> 

3、Web.xml配置

    <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>

至此基本配置完成,可以查看內(nèi)置監(jiān)控頁面了,路徑是/druid/index.html,
完整路徑是http://127.0.0.1:8080/druid/index.html
如果還需要使用Web應(yīng)用、URI監(jiān)控、Session監(jiān)控、Spring監(jiān)控等則還需要繼續(xù)增加配置。

4、Wen應(yīng)用配置
WebStatFilter用于采集web-jdbc關(guān)聯(lián)監(jiān)控的數(shù)據(jù)

在Web.xml中增加配置,就可以使用Web應(yīng)用、URI監(jiān)控、Session監(jiān)控等功能

<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>

5、Spring監(jiān)控配置
在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語言中最好的數(shù)據(jù)庫連接池。Druid能夠提供強大的監(jiān)控和擴展功能。

2. 在哪里下載druid

3. 怎么獲取Druid的源碼

Druid是一個開源項目,源碼托管在github上,源代碼倉庫地址是 https://github.com/alibaba/druid。同時每次Druid發(fā)布正式版本和快照的時候,都會把源碼打包,你可以從上面的下載地址中找到相關(guān)版本的源碼

4. 怎么配置maven

Druid 0.1.18 之后版本都發(fā)布到maven中央倉庫中,所以你只需要在項目的pom.xml中加上dependency就可以了。例如:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid-version}</version>
    </dependency>

也可以選擇 Maven倉庫查找公共的倉庫地址:http://www.mvnrepository.com/artifact/com.alibaba/druid

5. 怎么打開Druid的監(jiān)控統(tǒng)計功能

Druid的監(jiān)控統(tǒng)計功能是通過filter-chain擴展實現(xiàn),如果你要打開監(jiān)控統(tǒng)計功能,配置StatFilter,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

6. 怎樣使用Druid的內(nèi)置監(jiān)控頁面

內(nèi)置監(jiān)控頁面是一個Servlet,具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE

7. 內(nèi)置監(jiān)控中的Web和Spring關(guān)聯(lián)監(jiān)控怎么配置?

8. 怎么配置防御SQL注入攻擊

Druid提供了WallFilter,它是基于SQL語義分析來實現(xiàn)防御SQL注入攻擊的。具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

9. Druid有沒有參考配置

不同的業(yè)務(wù)場景需求不同,你可以使用我們的參考配置,但建議你仔細閱讀相關(guān)文檔,了解清楚之后做定制配置。https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_DruidDataSource%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AE

10. 我想日志記錄JDBC執(zhí)行的SQL,如何配置

Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這里https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

11. 我的程序可能產(chǎn)生連接泄漏了,有什么辦法?

Druid提供了多種監(jiān)測連接泄漏的手段,具體看這里:https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B

12. 在Druid中使用PSCache會有內(nèi)存占用過大問題么?

連接Oracle數(shù)據(jù)庫,打開PSCache,在其他的數(shù)據(jù)庫連接池都會存在內(nèi)存占用過多的問題,Druid是唯一解決這個問題的連接池。具體看這里:https://github.com/alibaba/druid/wiki/Oracle%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%8BPreparedStatementCache%E5%86%85%E5%AD%98%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88

13. 有沒有和其他數(shù)據(jù)庫連接池的對比?

14. 從其他連接池遷移要注意什么?

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

ExceptionSorter是JBoss DataSource中的優(yōu)秀特性,Druid也有一樣功能的ExceptionSorter,但不用手動配置,自動識別生效的。具體看這里:https://github.com/alibaba/druid/wiki/ExceptionSorter_cn

16. Druid中的maxIdle為什么是沒用的?

maxIdle是Druid為了方便DBCP用戶遷移而增加的,maxIdle是一個混亂的概念。連接池只應(yīng)該有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分別相當(dāng)于maxPoolSize和minPoolSize。

17. 我的應(yīng)用配置的是JNDI數(shù)據(jù)源,可以用DruidDataSource么?

DruidDataSource支持JNDI配置,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_JNDI_Tomcat
具體實現(xiàn)的類是這個:com.alibaba.druid.pool.DruidDataSourceFactory,你可以閱讀代碼加深理解。

18. 我的應(yīng)用已使用DBCP,是代碼中寫死的,怎樣更換為Druid?

可以的,Druid提供了一個中完全平滑遷移DBCP的辦法。

這種用法,使得可以在一些非自己開發(fā)的應(yīng)用中使用Druid,例如在sonar中部署druid,sonar是一個使用jruby開發(fā)的web應(yīng)用,寫死了DBCP,只能夠通過這種方法來更換。

19. 我想試用快照版本,怎么獲?。?/h1>

直接獲取快照版本的地址是:http://code.alibabatech.com/mvn/snapshots/com/alibaba/druid/ ,使用快照版本建議加入我們QQ群 92748305,遇到問題直接反饋給我們。

20. 有一些SQL執(zhí)行很慢,我希望日志記錄下來,怎么設(shè)置?

在StatFilter配置中有慢SQL執(zhí)行日志記錄,看這里https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

21. 我希望加密我的數(shù)據(jù)庫密碼怎么辦?

運維和DBA都不希望把密碼明文直接寫在配置文件中,Druid提供了數(shù)據(jù)庫秘密加密的功能。具體看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

22. 如何參與Druid的開發(fā)

Druid是一個通過github開源的項目,github的特性,使得你很容易參與其中。這里有詳細說明https://github.com/alibaba/druid/wiki/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E

23. Druid的發(fā)布周期是怎樣?

Druid是一個活躍的項目,長期維護。每個月有一個發(fā)布窗口,除非遇到重大bug和非常緊急的需求,否則都是每個月最多發(fā)布一次。如果沒有足夠多的需求,發(fā)布窗口就不會被使用。

24. 如果DruidDataSource在init的時候失敗了,不再使用,是否需要close

是的,如果DruidDataSource不再使用,必須調(diào)用close來釋放資源,釋放的資源包括關(guān)閉Create和Destory線程。

25. DruidDataSource支持哪些數(shù)據(jù)庫?

理論上說,支持所有有jdbc驅(qū)動的數(shù)據(jù)庫。實際測試過的有

| 數(shù)據(jù)庫 | 支持狀態(tài) |
| mysql | 支持,大規(guī)模使用 |
| oracle | 支持,大規(guī)模使用 |
| sqlserver | 支持 |
| postgres | 支持 |
| db2 | 支持 |
| h2 | 支持 |
| derby | 支持 |
| sqlite | 支持 |
| sybase | 支持 |

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

使用jdbc的executeBatch 方法,如果數(shù)據(jù)庫為oracle,則無論是否成功更新到數(shù)據(jù),返回值都是-2,而不是真正被sql更新到的記錄數(shù),這是Oracle JDBC Driver的問題,Druid不作特殊處理。

27. Druid如何自動根據(jù)URL自動識別DriverClass的

Druid是根據(jù)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. 如何保存監(jiān)控記錄

https://github.com/alibaba/druid/wiki/%E6%80%8E%E4%B9%88%E4%BF%9D%E5%AD%98Druid%E7%9A%84%E7%9B%91%E6%8E%A7%E8%AE%B0%E5%BD%95

29. 我想Log輸出SQL執(zhí)行的信息怎么辦?

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

30. 如何配置Druid內(nèi)置的log實現(xiàn)

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AEdruid%E5%86%85%E7%BD%AE%E7%9A%84log%E5%AE%9E%E7%8E%B0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容