Druid的簡介
Druid首先是一個(gè)數(shù)據(jù)庫連接池极阅。Druid是目前最好的數(shù)據(jù)庫連接池,在功能涨享、性能筋搏、擴(kuò)展性方面,都超過其他數(shù)據(jù)庫連接池灰伟,包括DBCP拆又、C3P0、BoneCP栏账、Proxool帖族、JBoss DataSource。Druid已經(jīng)在阿里巴巴部署了超過600個(gè)應(yīng)用挡爵,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗(yàn)竖般。Druid是阿里巴巴開發(fā)的號(hào)稱為監(jiān)控而生的數(shù)據(jù)庫連接池!
Druid的功能
1茶鹃、替換DBCP和C3P0涣雕。Druid提供了一個(gè)高效、功能強(qiáng)大闭翩、可擴(kuò)展性好的數(shù)據(jù)庫連接池挣郭。
2、可以監(jiān)控?cái)?shù)據(jù)庫訪問性能疗韵,Druid內(nèi)置提供了一個(gè)功能強(qiáng)大的StatFilter插件兑障,能夠詳細(xì)統(tǒng)計(jì)SQL的執(zhí)行性能,這對(duì)于線上分析數(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棍好、擴(kuò)展JDBC,如果你要對(duì)JDBC層有編程的需求允耿,可以通過Druid提供的Filter機(jī)制借笙,很方便編寫JDBC層的擴(kuò)展插件。
所以Druid可以:
1较锡、充當(dāng)數(shù)據(jù)庫連接池业稼。
2、可以監(jiān)控?cái)?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能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能除师。
2. 在哪里下載druid
- 正式版本下載:
maven中央倉庫: http://central.maven.org/maven2/com/alibaba/druid/
3. 怎么獲取Druid的源碼
Druid是一個(gè)開源項(xiàng)目,源碼托管在github上扔枫,源代碼倉庫地址是 https://github.com/alibaba/druid汛聚。同時(shí)每次Druid發(fā)布正式版本和快照的時(shí)候,都會(huì)把源碼打包短荐,你可以從上面的下載地址中找到相關(guān)版本的源碼
4. 怎么配置maven
Druid 0.1.18 之后版本都發(fā)布到maven中央倉庫中倚舀,所以你只需要在項(xiàng)目的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)計(jì)功能
Druid的監(jiān)控統(tǒng)計(jì)功能是通過filter-chain擴(kuò)展實(shí)現(xiàn)忍宋,如果你要打開監(jiān)控統(tǒng)計(jì)功能痕貌,配置StatFilter,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
6. 怎樣使用Druid的內(nèi)置監(jiān)控頁面
內(nèi)置監(jiān)控頁面是一個(gè)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語義分析來實(shí)現(xiàn)防御SQL注入攻擊的入宦。具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
9. Druid有沒有參考配置
不同的業(yè)務(wù)場景需求不同哺徊,你可以使用我們的參考配置,但建議你仔細(xì)閱讀相關(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)測(cè)連接泄漏的手段疗垛,具體看這里: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會(huì)有內(nèi)存占用過大問題么?
連接Oracle數(shù)據(jù)庫铅乡,打開PSCache继谚,在其他的數(shù)據(jù)庫連接池都會(huì)存在內(nèi)存占用過多的問題,Druid是唯一解決這個(gè)問題的連接池阵幸。具體看這里: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ù)庫連接池的對(duì)比花履?
- 各種數(shù)據(jù)庫連接池對(duì)比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ù)參照對(duì)比: 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诡壁,但不用手動(dòng)配置,自動(dòng)識(shí)別生效的荠割。具體看這里:https://github.com/alibaba/druid/wiki/ExceptionSorter_cn
16. Druid中的maxIdle為什么是沒用的妹卿?
maxIdle是Druid為了方便DBCP用戶遷移而增加的旺矾,maxIdle是一個(gè)混亂的概念。連接池只應(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
具體實(shí)現(xiàn)的類是這個(gè):com.alibaba.druid.pool.DruidDataSourceFactory狡门,你可以閱讀代碼加深理解陷寝。
18. 我的應(yīng)用已使用DBCP,是代碼中寫死的其馏,怎樣更換為Druid凤跑?
可以的,Druid提供了一個(gè)中完全平滑遷移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啟動(dòng)參數(shù)加上-Ddruid.filters=stat,動(dòng)態(tài)配置druid的filters
這種用法致扯,使得可以在一些非自己開發(fā)的應(yīng)用中使用Druid肤寝,例如在sonar中部署druid,sonar是一個(gè)使用jruby開發(fā)的web應(yīng)用抖僵,寫死了DBCP鲤看,只能夠通過這種方法來更換。
19. 我想試用快照版本耍群,怎么獲纫骞稹?
直接獲取快照版本的地址是: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ù)庫密碼怎么辦堰酿?
運(yùn)維和DBA都不希望把密碼明文直接寫在配置文件中,Druid提供了數(shù)據(jù)庫秘密加密的功能张足。具體看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
22. 如何參與Druid的開發(fā)
Druid是一個(gè)通過github開源的項(xiàng)目触创,github的特性,使得你很容易參與其中为牍。這里有詳細(xì)說明https://github.com/alibaba/druid/wiki/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E
23. Druid的發(fā)布周期是怎樣哼绑?
Druid是一個(gè)活躍的項(xiàng)目岩馍,長期維護(hù)。每個(gè)月有一個(gè)發(fā)布窗口抖韩,除非遇到重大bug和非常緊急的需求蛀恩,否則都是每個(gè)月最多發(fā)布一次。如果沒有足夠多的需求帽蝶,發(fā)布窗口就不會(huì)被使用赦肋。
24. 如果DruidDataSource在init的時(shí)候失敗了,不再使用励稳,是否需要close
是的,如果DruidDataSource不再使用囱井,必須調(diào)用close來釋放資源驹尼,釋放的資源包括關(guān)閉Create和Destory線程。
25. DruidDataSource支持哪些數(shù)據(jù)庫庞呕?
理論上說新翎,支持所有有jdbc驅(qū)動(dòng)的數(shù)據(jù)庫。實(shí)際測(cè)試過的有
| 數(shù)據(jù)庫 | 支持狀態(tài) |
| mysql | 支持住练,大規(guī)模使用 |
| oracle | 支持地啰,大規(guī)模使用 |
| sqlserver | 支持 |
| postgres | 支持 |
| db2 | 支持 |
| h2 | 支持 |
| derby | 支持 |
| sqlite | 支持 |
| sybase | 支持 |
26. Oracle下jdbc executeBatch時(shí),更新行數(shù)計(jì)算不正確
使用jdbc的executeBatch 方法讲逛,如果數(shù)據(jù)庫為oracle亏吝,則無論是否成功更新到數(shù)據(jù),返回值都是-2盏混,而不是真正被sql更新到的記錄數(shù)蔚鸥,這是Oracle JDBC Driver的問題,Druid不作特殊處理许赃。
27. Druid如何自動(dòng)根據(jù)URL自動(dòng)識(shí)別DriverClass的
Druid是根據(jù)url前綴來識(shí)別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十分混亂混聊,這個(gè)匹配不一定對(duì) |
| 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