該項目在阿里巴巴內部得到了廣泛的部署,在外部也有大量的用戶羣。爲了使大家更好地瞭解和使用Druid,我們採訪了Druid項目的主要負責人——溫少(博客)。
溫少是ITeye的名人了,爲了照顧新會員,先來個自我介紹吧!
2010年3月加入阿里巴巴至今,主要的工作是設計和實現阿里巴巴應用監控系統Dragoon,Druid和Fastjson都是監控系統實現的副產品。
Druid是什麼?有什麼作用?
Druid的項目背景?目前的項目團隊情況?開源目的?
2011年2月春節期間,我完成了連接池(DruidDataSource)的第一個版本,4月開始在生產環境測試,2012年第一季度開始大規模實施。
提交過代碼的開發者有5個人,主要代碼是我維護,有一人專門負責內部實施。
通過開源,希望有更多使用場景,更多的反饋,更多人蔘與其中,共同打造最好的數據庫連接池。
Druid支持哪些數據庫?
Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存佔用優化,MySql的ping檢測優化。
Druid是如何擴展JDBC的?
爲什麼說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的性能如何?能否給出一些測試對比數據?
這裏有一些測試數據:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2916539
談談Druid的SQL解析功能?效率如何?
簡單SQL語句用時10微秒以內,複雜SQL用時30微秒。
通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。
Druid的擴展性如何?
在SQL注入防禦方面,Druid的優勢是什麼?實現原理是什麼?
Druid實現了Oracle、MySql、Postgresql、SQL-92的Parser,基於SQL語法分析實現,理解其中的SQL語義,智能、準確、誤報率低。
具體細節參考這裏:http://code.alibabatech.com/wiki/display/Druid/WallFilter
目前Druid的應用(部署)情況?
我想將其中的某個模塊(比如監控模塊)用到其他連接池,是否可以?模塊的獨立性如何?
我想在項目中使用,應該注意哪些事項?能否用於商業項目?
配置是否複雜?能否給出一個典型的配置實例?
以下是一個參考配置:
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
- <property name="url" value="${jdbc_url}" />
- <property name="username" value="${jdbc_user}" />
- <property name="password" value="${jdbc_password}" />
- <property name="filters" value="stat" />
- <property name="maxActive" value="20" />
- <property name="initialSize" value="1" />
- <property name="maxWait" value="60000" />
- <property name="minIdle" value="1" />
- <property name="timeBetweenEvictionRunsMillis" value="60000" />
- <property name="minEvictableIdleTimeMillis" value="300000" />
- <property name="validationQuery" value="SELECT 'x'" />
- <property name="testWhileIdle" value="true" />
- <property name="testOnBorrow" value="false" />
- <property name="testOnReturn" value="false" />
- <property name="poolPreparedStatements" value="true" />
- <property name="maxPoolPreparedStatementPerConnectionSize" value="50" />
- </bean>
在上面的配置中,通常你需要配置url、username、password、maxActive這幾項。
在DruidDataSource中,你可以不配置DriverClass,它根據url自動識別。Druid能夠自動識別20多中url,常見的JDBC Driver都包括了。
我目前使用其他連接池(DBCP/C3P0/Proxool等),如何遷移到Druid?
Druid網站上提供了Druid/DBCP/C3P0/JBoss/WebLogic的參數對照表,通過這個對照表來遷移你目前的配置。
其他開發者如何反饋問題、提交bug?
你可以在github上提交patch和issue(包括bug和新特性)。你也可以加入我們的QQ羣92748305,和開發者以及其他用戶一起交流。