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
- 正式版本下載:
maven中央倉庫: http://central.maven.org/maven2/com/alibaba/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)控怎么配置?
- Web關(guān)聯(lián)監(jiān)控配置
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter - Spring關(guān)聯(lián)監(jiān)控配置
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_Druid%E5%92%8CSpring%E5%85%B3%E8%81%94%E7%9B%91%E6%8E%A7%E9%85%8D%E7%BD%AE
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ù)庫連接池的對比?
- 各種數(shù)據(jù)庫連接池對比https://github.com/alibaba/druid/wiki/%E5%90%84%E7%A7%8D%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0%E5%AF%B9%E6%AF%94
14. 從其他連接池遷移要注意什么?
- 不同連接池的參數(shù)參照對比: http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=6947005
- DBCP遷移 https://github.com/alibaba/druid/wiki/DBCP%E8%BF%81%E7%A7%BB
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的辦法。
- 從http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下載druid-wrapper-xxx.jar
- 加入druid-xxx.jar
- 從你的WEB-INF/lib/中刪除dbcp-xxx.jar
- 按需要加上配置,比如JVM啟動參數(shù)加上-Ddruid.filters=stat,動態(tài)配置druid的filters
這種用法,使得可以在一些非自己開發(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)控記錄
29. 我想Log輸出SQL執(zhí)行的信息怎么辦?
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter