Druid連接池簡介和配置


Druid是什么?有什么作用? Top

Druid首先是一個數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。

Druid的項目背景?目前的項目團隊情況?開源目的? Top

2010年開始,我負責設計一個叫做Dragoon的監控系統,需要一些監控組件,監控應用程序的運行情況,包括Web URI、Spring、JDBC等。為了監控SQL執行情況,我做了一個Filter-Chain模式的ProxyDriver,缺省提供StatFilter。當時我還做了一個SQL Parser。老板說,不如我們來一個更大的計划,把連接池、SQL Parser、Proxy Driver合起來做一個項目,命名為Druid,於是Druid就誕生了。

2011年2月春節期間,我完成了連接池(DruidDataSource)的第一個版本,4月開始在生產環境測試,2012年第一季度開始大規模實施。

提交過代碼的開發者有5個人,主要代碼是我維護,有一人專門負責內部實施。

通過開源,希望有更多使用場景,更多的反饋,更多人參與其中,共同打造最好的數據庫連接池。

Druid支持哪些數據庫? Top

Druid支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。

Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存占用優化,MySql的ping檢測優化。

Druid是如何擴展JDBC的? Top

Druid在DruidDataSourc和ProxyDriver上提供了Filter-Chain模式的擴展API,類似Serlvet的Filter,配置Filter攔截JDBC的方法調用。

為什么說Druid是“最好的數據庫連接池”?體現在哪些方面?這是如何實現的? Top

阿里巴巴是一個重度使用關系數據庫的公司,我們在生產環境中大量的使用Druid,通過長期在極高負載的生產環境中實際使用、修改和完善,讓Druid逐步發展成最好的數據庫連接池。Druid在監控、可擴展性、穩定性和性能方面都有明顯的優勢。

首先,強大的監控特性,通過Druid提供的監控功能,可以清楚知道連接池和SQL的工作情況。

  • 監控SQL的執行時間、ResultSet持有時間、返回行數、更新行數、錯誤次數、錯誤堆棧信息。
  • SQL執行的耗時區間分布。什么是耗時區間分布呢?比如說,某個SQL執行了1000次,其中0~1毫秒區間50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通過耗時區間分布,能夠非常清楚知道SQL的執行耗時情況。
  • 監控連接池的物理連接創建和銷毀次數、邏輯連接的申請和關閉次數、非空等待次數、PSCache命中率等。

其次,方便擴展。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日志等等。

Druid內置提供了用於監控的StatFilter、日志輸出的Log系列Filter、防御SQL注入攻擊的WallFilter。

阿里巴巴內部實現了用於數據庫密碼加密的CirceFilter,以及和Web、Spring關聯監控的DragoonStatFilter。


第三,Druid集合了開源和商業數據庫連接池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。

  • ExceptionSorter。當一個連接產生不可恢復的異常時,例如Oracle error_code_28 session has been killed,必須立刻從連接池中逐出,否則會產生大量錯誤。目前只有Druid和JBoss DataSource實現了ExceptionSorter。
  • PSCache內存占用優化對於支持游標的數據庫(Oracle、SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL執行性能。一個PreparedStatement對應服務器一個游標,如果PreparedStatement被緩存起來重復執行,PreparedStatement沒有被關閉,服務器端的游標就不會被關閉,性能提高非常顯著。在類似“SELECT * FROM T WHERE ID = ?”這樣的場景,性能可能是一個數量級的提升。但在Oracle JDBC Driver中,其他的數據庫連接池(DBCP、JBossDataSource)會占用內存過多,極端情況可能大於1G。Druid調用OracleDriver提供管理PSCache內部API。
  • LRU是一個性能關鍵指標,特別Oracle,每個Connection對應數據庫端的一個進程,如果數據庫連接池遵從LRU,有助於數據庫服務器優化,這是重要的指標。Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0則不是。BoneCP在mock環境下性能可能還好,但在真實環境中則就不好了。

Druid的性能如何?能否給出一些測試對比數據? Top

性能不是Druid的設計目標,但是測試數據表明,Druid性能比DBCP、C3P0、Proxool、JBoss都好。

這里有一些測試數據: http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2916539

談談Druid的SQL解析功能?效率如何? Top

Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。

簡單SQL語句用時10微秒以內,復雜SQL用時30微秒。

通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防御SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。

Druid的擴展性如何? Top

Druid提供Filter-Chain模式的插件框架,通過編寫Filter配置到DruidDataSource中就可以攔截JDBC的各種API,從而實現擴展。Druid提供了一系列內置Filter。

在SQL注入防御方面,Druid的優勢是什么?實現原理是什么? Top

Druid的優勢是在JDBC最低層進行攔截做判斷,不會遺漏。

Druid實現了Oracle、MySql、Postgresql、SQL-92的Parser,基於SQL語法分析實現,理解其中的SQL語義,智能、准確、誤報率低。

具體細節參考這里: http://code.alibabatech.com/wiki/display/Druid/WallFilter

目前Druid的應用(部署)情況? Top

Druid是阿里巴巴監控系統Dragoon的副產品,從Dragoon監控系統的數據來看,在阿里巴巴已經部署了600多個應用。在阿里巴巴外部也有很多Druid的用戶,外部用戶沒有正式統計數據,但經常有反饋。

我想將其中的某個模塊(比如監控模塊)用到其他連接池,是否可以?模塊的獨立性如何? Top

可以通過DruidDriver把內置的Filter用在其他連接池中。在2011年上半年DruidDataSource不成熟的時候,我們也是這么做的。在其他連接池中使用內置的Filter,需要修改jdbc-url,使用DruidDriver作為一個ProxyDriver。

我想在項目中使用,應該注意哪些事項?能否用於商業項目? Top

Druid是一個開源項目,基於Apache 2.0協議,你可以免費自由使用。Druid只支持JDK 6以上版本,不支持JDK 1.4和JDK 5.0。

 

 

 

 

 

Druid集連接池,監控於一體整好復合當前項目的需要,項目是ssh結構,之前是用C3p0的,現在換一個連接池也是很簡單的,首先spring配置DataSource,配置如下:

[html]  view plain  copy
 
  1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">   
  2.     <!-- 基本屬性 url、user、password -->  
  3.     <property name="url" value="${jdbc_url}" />  
  4.     <property name="username" value="${jdbc_user}" />  
  5.     <property name="password" value="${jdbc_password}" />  
  6.         
  7.     <!-- 配置初始化大小、最小、最大 -->  
  8.     <property name="initialSize" value="1" />  
  9.     <property name="minIdle" value="1" />   
  10.     <property name="maxActive" value="20" />  
  11.    
  12.     <!-- 配置獲取連接等待超時的時間 -->  
  13.     <property name="maxWait" value="60000" />  
  14.    
  15.     <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->  
  16.     <property name="timeBetweenEvictionRunsMillis" value="60000" />  
  17.    
  18.     <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->  
  19.     <property name="minEvictableIdleTimeMillis" value="300000" />  
  20.     
  21.     <property name="validationQuery" value="SELECT 'x'" />  
  22.     <property name="testWhileIdle" value="true" />  
  23.     <property name="testOnBorrow" value="false" />  
  24.     <property name="testOnReturn" value="false" />  
  25.    
  26.     <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->  
  27.     <property name="poolPreparedStatements" value="true" />  
  28.     <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />  
  29.    
  30.     <!-- 配置監控統計攔截的filters,去掉后監控界面sql無法統計 -->  
  31.     <property name="filters" value="stat" />   
  32. </bean>  

 

目前這樣的配置已經能夠使用連接池,注意不要忘記了jar文件,下載地址:http://code.alibabatech.com/mvn/releases/com/alibaba/druid/

 

然后是監控的配置:

web.xml

[html]  view plain  copy
 
  1.   </span><filter>  
  2.         <filter-name>DruidWebStatFilter</filter-name>  
  3.         <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>exclusions</param-name>  
  6.             <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>  
  7.         </init-param>  
  8.       </filter>  
  9.       <filter-mapping>  
  10.         <filter-name>DruidWebStatFilter</filter-name>  
  11.         <url-pattern>/*</url-pattern>  
  12.       </filter-mapping>  

filter可以監控webURl 訪問

 

[html]  view plain  copy
 
  1.     <servlet>  
  2.         <servlet-name>DruidStatView</servlet-name>  
  3.         <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
  4.     </servlet>  
  5.     <servlet-mapping>  
  6.         <servlet-name>DruidStatView</servlet-name>  
  7.         <url-pattern>/druid/*</url-pattern>  
  8.     </servlet-mapping>  

該配置可以訪問監控界面

 

配置好后訪問 http://ip:port/projectName/druid/index.html

經過上面的配置,我們已經能夠達到連接池的使用和監控


免責聲明!

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



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