druid現(xiàn)在是目前做的最好,使用最為廣泛的數(shù)據(jù)源,可能剛接觸數(shù)據(jù)源會(huì)有一些些陌生,來(lái)看看數(shù)據(jù)源的阿里巴巴 druid 使用常見(jiàn)問(wèn)題吧!
本文原地址:https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
歡迎大家使用Druid幢哨,常見(jiàn)問(wèn)題在這里解答,希望對(duì)大家有所幫助。
1. Druid是什么稠通?
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池脱盲。Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能香府。
2. 在哪里下載druid
- 正式版本下載:
maven中央倉(cāng)庫(kù): http://central.maven.org/maven2/com/alibaba/druid/
3. 怎么獲取Druid的源碼
Druid是一個(gè)開(kāi)源項(xiàng)目谷暮,源碼托管在github上夫椭,源代碼倉(cāng)庫(kù)地址是 https://github.com/alibaba/druid 恩急。同時(shí)每次Druid發(fā)布正式版本和快照的時(shí)候杉畜,都會(huì)把源碼打包,你可以從上面的下載地址中找到相關(guān)版本的源碼
4. 怎么配置maven
Druid 0.1.18 之后版本都發(fā)布到maven中央倉(cāng)庫(kù)中衷恭,所以你只需要在項(xiàng)目的pom.xml中加上dependency就可以了此叠。例如:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
也可以選擇 Maven倉(cāng)庫(kù)查找公共的倉(cāng)庫(kù)地址: http://www.mvnrepository.com/artifact/com.alibaba/druid
5. 怎么打開(kāi)Druid的監(jiān)控統(tǒng)計(jì)功能
Druid的監(jiān)控統(tǒng)計(jì)功能是通過(guò)filter-chain擴(kuò)展實(shí)現(xiàn),如果你要打開(kāi)監(jiān)控統(tǒng)計(jì)功能随珠,配置StatFilter灭袁,具體看這里:https://github.com/alibaba/druid/wiki/配置_StatFilter
6. 怎樣使用Druid的內(nèi)置監(jiān)控頁(yè)面
內(nèi)置監(jiān)控頁(yè)面是一個(gè)Servlet猬错,具體配置看這里:
https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置
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/配置_配置WebStatFilter - Spring關(guān)聯(lián)監(jiān)控配置
https://github.com/alibaba/druid/wiki/配置_Druid和Spring關(guān)聯(lián)監(jiān)控配置
8. 怎么配置防御SQL注入攻擊
Druid提供了WallFilter茸歧,它是基于SQL語(yǔ)義分析來(lái)實(shí)現(xiàn)防御SQL注入攻擊的倦炒。具體配置看這里:
https://github.com/alibaba/druid/wiki/配置-wallfilter
9. Druid有沒(méi)有參考配置
不同的業(yè)務(wù)場(chǎng)景需求不同,你可以使用我們的參考配置软瞎,但建議你仔細(xì)閱讀相關(guān)文檔逢唤,了解清楚之后做定制配置。
https://github.com/alibaba/druid/wiki/配置_DruidDataSource參考配置
10. 我想日志記錄JDBC執(zhí)行的SQL涤浇,如何配置
Druid提供了Log4jFilter鳖藕、CommonsLogFilter和Slf4jFilter,具體配置看這里
https://github.com/alibaba/druid/wiki/配置_LogFilter
11. 我的程序可能產(chǎn)生連接泄漏了只锭,有什么辦法著恩?
Druid提供了多種監(jiān)測(cè)連接泄漏的手段,具體看這里:
https://github.com/alibaba/druid/wiki/連接泄漏監(jiān)測(cè)
12. 在Druid中使用PSCache會(huì)有內(nèi)存占用過(guò)大問(wèn)題么纹烹?
連接Oracle數(shù)據(jù)庫(kù)页滚,打開(kāi)PSCache,在其他的數(shù)據(jù)庫(kù)連接池都會(huì)存在內(nèi)存占用過(guò)多的問(wèn)題铺呵,Druid是唯一解決這個(gè)問(wèn)題的連接池裹驰。具體看這里:
https://github.com/alibaba/druid/wiki/Oracle數(shù)據(jù)庫(kù)下PreparedStatementCache內(nèi)存問(wèn)題解決方案
13. 有沒(méi)有和其他數(shù)據(jù)庫(kù)連接池的對(duì)比?
- 各種數(shù)據(jù)庫(kù)連接池對(duì)比
https://github.com/alibaba/druid/wiki/各種數(shù)據(jù)庫(kù)連接池對(duì)比
14. 從其他連接池遷移要注意什么片挂?
- 不同連接池的參數(shù)參照對(duì)比:
http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=6947005 - DBCP遷移 https://github.com/alibaba/druid/wiki/DBCP遷移
15. Druid中有沒(méi)有類(lèi)似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為什么是沒(méi)用的?
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/配置_JNDI_Tomcat
具體實(shí)現(xiàn)的類(lèi)是這個(gè):com.alibaba.druid.pool.DruidDataSourceFactory,你可以閱讀代碼加深理解告丢。
18. 我的應(yīng)用已使用DBCP枪蘑,是代碼中寫(xiě)死的,怎樣更換為Druid?
可以的岳颇,Druid提供了一個(gè)中完全平滑遷移DBCP的辦法照捡。
- 從http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下載druid-wrapper-xxx.jar
- 從http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下載druid-wrapper-xxx.jar
- 加入druid-xxx.jar
- 加入druid-xxx.jar
- 從你的WEB-INF/lib/中刪除dbcp-xxx.jar
- 從你的WEB-INF/lib/中刪除dbcp-xxx.jar
- 按需要加上配置,比如JVM啟動(dòng)參數(shù)加上-Ddruid.filters=stat赦役,動(dòng)態(tài)配置druid的filters
- 按需要加上配置,比如JVM啟動(dòng)參數(shù)加上-Ddruid.filters=stat赦役,動(dòng)態(tài)配置druid的filters
這種用法麻敌,使得可以在一些非自己開(kāi)發(fā)的應(yīng)用中使用Druid,例如在sonar中部署druid掂摔,sonar是一個(gè)使用jruby開(kāi)發(fā)的web應(yīng)用术羔,寫(xiě)死了DBCP,只能夠通過(guò)這種方法來(lái)更換乙漓。
19. 我想試用快照版本级历,怎么獲取叭披?
直接獲取快照版本的地址是:http://code.alibabatech.com/mvn/snapshots/com/alibaba/druid/ 寥殖,使用快照版本建議加入我們QQ群 92748305,遇到問(wèn)題直接反饋給我們涩蜘。
20. 有一些SQL執(zhí)行很慢嚼贡,我希望日志記錄下來(lái),怎么設(shè)置同诫?
在StatFilter配置中有慢SQL執(zhí)行日志記錄粤策,看這里 https://github.com/alibaba/druid/wiki/配置_StatFilter
21. 我希望加密我的數(shù)據(jù)庫(kù)密碼怎么辦?
運(yùn)維和DBA都不希望把密碼明文直接寫(xiě)在配置文件中误窖,Druid提供了數(shù)據(jù)庫(kù)密碼加密的功能叮盘。具體看這里:
https://github.com/alibaba/druid/wiki/使用ConfigFilter
22. 如何參與Druid的開(kāi)發(fā)
Druid是一個(gè)通過(guò)github開(kāi)源的項(xiàng)目,github的特性霹俺,使得你很容易參與其中柔吼。這里有詳細(xì)說(shuō)明
https://github.com/alibaba/druid/wiki/如何參與
23. Druid的發(fā)布周期是怎樣?
Druid是一個(gè)活躍的項(xiàng)目丙唧,長(zhǎng)期維護(hù)愈魏。每個(gè)月有一個(gè)發(fā)布窗口,除非遇到重大bug和非常緊急的需求想际,否則都是每個(gè)月最多發(fā)布一次培漏。如果沒(méi)有足夠多的需求,發(fā)布窗口就不會(huì)被使用沼琉。
24. 如果DruidDataSource在init的時(shí)候失敗了北苟,不再使用桩匪,是否需要close
是的打瘪,如果DruidDataSource不再使用,必須調(diào)用close來(lái)釋放資源,釋放的資源包括關(guān)閉Create和Destory線程闺骚。
25. DruidDataSource支持哪些數(shù)據(jù)庫(kù)彩扔?
理論上說(shuō),支持所有有jdbc驅(qū)動(dòng)的數(shù)據(jù)庫(kù)僻爽。實(shí)際測(cè)試過(guò)的有
數(shù)據(jù)庫(kù) | 支持狀態(tài) |
---|---|
mysql | 支持虫碉,大規(guī)模使用 |
oracle | 支持,大規(guī)模使用 |
sqlserver | 支持 |
postgres | 支持 |
db2 | 支持 |
h2 | 支持 |
derby | 支持 |
sqlite | 支持 |
sybase | 支持 |
26. Oracle下jdbc executeBatch時(shí)胸梆,更新行數(shù)計(jì)算不正確
使用jdbc的executeBatch 方法敦捧,如果數(shù)據(jù)庫(kù)為oracle,則無(wú)論是否成功更新到數(shù)據(jù)碰镜,返回值都是-2兢卵,而不是真正被sql更新到的記錄數(shù),這是Oracle JDBC Driver的問(wèn)題绪颖,Druid不作特殊處理秽荤。
27. Druid如何自動(dòng)根據(jù)URL自動(dòng)識(shí)別DriverClass的
Druid是根據(jù)url前綴來(lái)識(shí)別DriverClass的,這樣使得配置更方便簡(jiǎn)潔柠横。
前綴 | 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.DB2DriverD | B2的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)控記錄
https://github.com/alibaba/druid/wiki/怎么保存Druid的監(jiān)控記錄
29. 我想Log輸出SQL執(zhí)行的信息怎么辦?
https://github.com/alibaba/druid/wiki/配置_LogFilter
30. 如何配置Druid內(nèi)置的log實(shí)現(xiàn)
https://github.com/alibaba/druid/wiki/配置druid內(nèi)置的log實(shí)現(xiàn)
31. 如何在Spring Boot中集成Druid連接池和監(jiān)控牍氛?
使用Druid Spring Boot Starter晨继,文檔地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
31. 如何在Spring Boot中添加自定義WallConfig、Filter 糜俗?
https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter#如何配置-filter
32. 如何在 Spring Boot 中配置數(shù)據(jù)庫(kù)密碼加密踱稍?
- 先看常見(jiàn)問(wèn)題#21,如何生成加密后的密碼及秘鑰:我希望加密我的數(shù)據(jù)庫(kù)密碼怎么辦悠抹?
- 進(jìn)行配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
# 生成的加密后的密碼(原密碼 123456)
spring.datasource.password=WVMjPhfXQrIsWRo0/RCqAVvYtTU9WNVToKJohb8AlUmHwnV6vwFL+FM2CNFDMJwGHW1iCmyaUlF+sgvFdogqEA==
# 生成的公鑰
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIiwHpFrDijV+GzwRTzWJk8D3j3jFfhsMFJ/7k1NTvBuLgL+TdIHgaMNOIEjHpXzuvX38J3FtOK8hLrySncVGOMCAwEAAQ==
# 配置 connection-properties珠月,啟用加密,配置公鑰楔敌。
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
# 啟用ConfigFilter
spring.datasource.druid.filter.config.enabled=true
33. 如何設(shè)置為讓連接池知道數(shù)據(jù)庫(kù)已經(jīng)斷開(kāi)了啤挎,并且自動(dòng)測(cè)試連接查詢(xún)
加入以下配置:
<!-- 用來(lái)檢測(cè)連接是否有效的sql,要求是一個(gè)查詢(xún)語(yǔ)句卵凑,常用select 'x'庆聘。如果validationQuery為null,testOnBorrow勺卢、testOnReturn伙判、testWhileIdle都不會(huì)起作用。 -->
<property name="validationQuery" value="SELECT 1" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
出錯(cuò)的異常信息摘要: Could not open JDBC Connection for transaction黑忱; nested exception is ...jdbc4... No operation allowed after connection closed;