Druid的簡介
Druid首先是一個數據庫連接池。Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。Druid是阿里巴巴開發的號稱為監控而生的數據庫連接池!
Druid的功能
1、替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
2、可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。
3、數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
4、SQL執行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
5、擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。
所以Druid可以:
1、充當數據庫連接池。
2、可以監控數據庫訪問性能
3、獲得SQL執行日志
工程配置如下:
1、工程引入druid-1.0.15.jar
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
2、數據源配置
<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。詳細看這里: https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter |
|
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, 是組合關系,並非替換關系 |
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>
至此基本配置完成,可以查看內置監控頁面了,路徑是/druid/index.html,
完整路徑是http://127.0.0.1:8080/druid/index.html
如果還需要使用Web應用、URI監控、Session監控、Spring監控等則還需要繼續增加配置。
4、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>
5、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
- 正式版本下載:
maven中央倉庫: http://central.maven.org/maven2/com/alibaba/druid/
3. 怎么獲取Druid的源碼
Druid是一個開源項目,源碼托管在github上,源代碼倉庫地址是 https://github.com/alibaba/druid。同時每次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倉庫查找公共的倉庫地址:http://www.mvnrepository.com/artifact/com.alibaba/druid
5. 怎么打開Druid的監控統計功能
Druid的監控統計功能是通過filter-chain擴展實現,如果你要打開監控統計功能,配置StatFilter,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
6. 怎樣使用Druid的內置監控頁面
內置監控頁面是一個Servlet,具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
7. 內置監控中的Web和Spring關聯監控怎么配置?
- Web關聯監控配置
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter - Spring關聯監控配置
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語義分析來實現防御SQL注入攻擊的。具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
9. Druid有沒有參考配置
不同的業務場景需求不同,你可以使用我們的參考配置,但建議你仔細閱讀相關文檔,了解清楚之后做定制配置。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執行的SQL,如何配置
Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這里https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter
11. 我的程序可能產生連接泄漏了,有什么辦法?
Druid提供了多種監測連接泄漏的手段,具體看這里: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會有內存占用過大問題么?
連接Oracle數據庫,打開PSCache,在其他的數據庫連接池都會存在內存占用過多的問題,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. 有沒有和其他數據庫連接池的對比?
14. 從其他連接池遷移要注意什么?
- 不同連接池的參數參照對比: 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中的優秀特性,Druid也有一樣功能的ExceptionSorter,但不用手動配置,自動識別生效的。具體看這里:https://github.com/alibaba/druid/wiki/ExceptionSorter_cn
16. Druid中的maxIdle為什么是沒用的?
maxIdle是Druid為了方便DBCP用戶遷移而增加的,maxIdle是一個混亂的概念。連接池只應該有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分別相當於maxPoolSize和minPoolSize。
17. 我的應用配置的是JNDI數據源,可以用DruidDataSource么?
DruidDataSource支持JNDI配置,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_JNDI_Tomcat
具體實現的類是這個:com.alibaba.druid.pool.DruidDataSourceFactory,你可以閱讀代碼加深理解。
18. 我的應用已使用DBCP,是代碼中寫死的,怎樣更換為Druid?
可以的,Druid提供了一個中完全平滑遷移DBCP的辦法。
- 1) 從http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下載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. 我想試用快照版本,怎么獲取?
直接獲取快照版本的地址是:http://code.alibabatech.com/mvn/snapshots/com/alibaba/druid/ ,使用快照版本建議加入我們QQ群 92748305,遇到問題直接反饋給我們。
20. 有一些SQL執行很慢,我希望日志記錄下來,怎么設置?
在StatFilter配置中有慢SQL執行日志記錄,看這里https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
21. 我希望加密我的數據庫密碼怎么辦?
運維和DBA都不希望把密碼明文直接寫在配置文件中,Druid提供了數據庫秘密加密的功能。具體看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
22. 如何參與Druid的開發
Druid是一個通過github開源的項目,github的特性,使得你很容易參與其中。這里有詳細說明https://github.com/alibaba/druid/wiki/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E
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. 如何保存監控記錄
29. 我想Log輸出SQL執行的信息怎么辦?
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter
30. 如何配置Druid內置的log實現
附:示例項目:
https://github.com/windwant/spring-dubbo-service.git
https://github.com/windwant/spring-boot-service.git
https://github.com/windwant/spring-cloud-service.git