使用Druid作為數據源


Druid號稱是Java語言中最好的數據庫連接池。

1) 可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。

 

2) 替換DBCPC3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。

3) 數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。

4) SQL執行日志,Druid提供了不同的LogFilter,能夠支持Common-LoggingLog4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。

5) 能夠提供基於Filter-Chain模式的插件體系。

 

下面介紹下如何在項目中集成Druid:

1、maven依賴

Xml代碼  
  1. <dependency>  
  2.         <groupId>com.alibaba</groupId>  
  3.         <artifactId>druid</artifactId>  
  4.         <version>${druid-version}</version>  
  5.     </dependency>  

 2、配置web.xml

Xml代碼  
  1. <!-- druid -->  
  2. <servlet>  
  3.     <servlet-name>DruidStatView</servlet-name>  
  4.     <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.     <servlet-name>DruidStatView</servlet-name>  
  8.     <url-pattern>/druid/*</url-pattern>  
  9. </servlet-mapping>  
  10.   
  11. <filter>  
  12.     <filter-name>DruidWebStatFilter</filter-name>  
  13.     <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>  
  14.     <init-param>  
  15.         <param-name>exclusions</param-name>  
  16.         <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>  
  17.     </init-param>  
  18. </filter>  
  19. <filter-mapping>  
  20.     <filter-name>DruidWebStatFilter</filter-name>  
  21.     <url-pattern>/*</url-pattern>  
  22. </filter-mapping>  

 3、spring.xml中配置druid數據源

Xml代碼  
  1. <!-- 數據源druid -->  
  2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"   
  3. init-method="init" destroy-method="close">  
  4.     <property name="driverClassName" value="${jdbc.driverClassName}" />  
  5.     <property name="url" value="${jdbc.url}" />  
  6.     <property name="username" value="${jdbc.username}" />  
  7.     <property name="password" value="${jdbc.password}" />  
  8.       
  9.      <!-- 配置初始化大小、最小、最大 -->    
  10.     <property name="initialSize" value="${druid.pool.size.init}" />    
  11.     <property name="minIdle" value="${druid.pool.size.min}" />     
  12.     <property name="maxActive" value="${druid.pool.size.max}" />    
  13.       
  14.     <!-- 配置監控統計攔截的filters,去掉后監控界面sql無法統計 -->  
  15.     <property name="filters" value="stat" />   
  16. </bean>  

 

Druid常見問題:

 

1、怎么打開Druid的監控統計功能

 Druid的監控統計功能是通過filter-chain擴展實現,如果你要打開監控統計功能,配置StatFilter。

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

 

2、怎樣使用Druid的內置監控頁面

內置監控頁面是一個Servlet。

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

 

3、內置監控中的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

 

4、怎么配置防御SQL注入攻擊

Druid提供了WallFilter,它是基於SQL語義分析來實現防御SQL注入攻擊的。

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

 

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

 

6、我想日志記錄JDBC執行的SQL,如何配置

Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter。

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

 

7、我的程序可能產生連接泄漏了,有什么辦法?

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

 

8、在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

 

9、有沒有和其他數據庫連接池的對比?

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

 

10、從其他連接池遷移要注意什么?

不同連接池的參數參照對比:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=6947005

DBCP遷移 https://github.com/alibaba/druid/wiki/DBCP%E8%BF%81%E7%A7%BB

 

11、Druid中有沒有類似Jboss DataSource中的ExceptionSorter

ExceptionSorter是JBoss DataSource中的優秀特性,Druid也有一樣功能的ExceptionSorter,但不用手動配置,自動識別生效的。

具體看這里:http://code.alibabatech.com/wiki/display/Druid/ExceptionSorter

 

12、Druid中的maxIdle為什么是沒用的?

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

 

13、我的應用配置的是JNDI數據源,可以用DruidDataSource么?

DruidDataSource支持JNDI配置,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_JNDI_Tomcat 

具體實現的類是這個:com.alibaba.druid.pool.DruidDataSourceFactory,你可以閱讀代碼加深理解。

 

14、我的應用已使用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,只能夠通過這種方法來更換。

 

 

15、有一些SQL執行很慢,我希望日志記錄下來,怎么設置?

在StatFilter配置中有慢SQL執行日志記錄。

看這里 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

 

16、我希望加密我的數據庫密碼怎么辦?

運維和DBA都不希望把密碼明文直接寫在配置文件中,Druid提供了數據庫秘密加密的功能。

具體看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

 

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

是的,如果DruidDataSource不再使用,必須調用close來釋放資源,釋放的資源包括關閉Create和Destory線程。

 

18、DruidDataSource支持哪些數據庫?

理論上說,支持所有有jdbc驅動的數據庫。

 

19、Oracle下jdbc executeBatch時,更新行數計算不正確

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

 

20、Druid如何自動根據URL自動識別DriverClass的

Druid是根據url前綴來識別DriverClass的,這樣使得配置更方便簡潔。

 

21、如何保存監控記錄

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

 

22、我想Log輸出SQL執行的信息怎么辦?

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

 

23、如何配置Druid內置的log實現

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM