該項目在阿里巴巴內部得到了廣泛的部署,在外部也有大量的用戶羣。爲了使大家更好地瞭解和使用Druid,我們採訪了Druid項目的主要負責人——溫少(博客)。
問:溫少是ITeye的名人了,爲了照顧新會員,先來個自我介紹吧!
溫少:我2001年畢業於深圳大學,畢業後到金蝶軟件研發中心工作9年,工作內容包括工作流引擎、多數據庫支持引擎、短信網網關等。
2010年3月加入阿里巴巴至今,主要的工作是設計和實現阿里巴巴應用監控系統Dragoon,Druid和Fastjson都是監控系統實現的副產品。
問:Druid是什麼?有什麼作用?
溫少:Druid首先是一個數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。
問:Druid的項目背景?目前的項目團隊情況?開源目的?
溫少: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支持哪些數據庫?
溫少:Druid支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存佔用優化,MySql的ping檢測優化。
問:Druid是如何擴展JDBC的?
溫少:Druid在DruidDataSourc和ProxyDriver上提供了Filter-Chain模式的擴展API,類似Serlvet的Filter,配置Filter攔截JDBC的方法調用。
問:爲什麼說Druid是「最好的數據庫連接池」?體現在哪些方面?這是如何實現的?
溫少:阿里巴巴是一個重度使用關係數據庫的公司,我們在生產環境中大量的使用Druid,通過長期在極高負載的生產環境中實際使用、修改和完善,讓Druid逐步發展成最好的數據庫連接池。Druid在監控、可擴展性、穩定性和性能方面都有明顯的優勢。
首先,強大的監控特性,通過Druid提供的監控功能,可以清楚知道連接池和SQL的工作情況。
其次,方便擴展。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日誌等等。
第三,Druid集合了開源和商業數據庫連接池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。
問:Druid的性能如何?能否給出一些測試對比數據?
溫少:性能不是Druid的設計目標,但是測試數據表明,Druid性能比DBCP、C3P0、Proxool、JBoss都好。
這裏有一些測試數據:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2916539
問:談談Druid的SQL解析功能?效率如何?
溫少: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的擴展性如何?
溫少:Druid提供Filter-Chain模式的插件框架,通過編寫Filter配置到DruidDataSource中就可以攔截JDBC的各種API,從而實現擴展。Druid提供了一系列內置Filter。
問:在SQL注入防禦方面,Druid的優勢是什麼?實現原理是什麼?
溫少:Druid的優勢是在JDBC最低層進行攔截做判斷,不會遺漏。
Druid實現了Oracle、MySql、Postgresql、SQL-92的Parser,基於SQL語法分析實現,理解其中的SQL語義,智能、準確、誤報率低。
具體細節參考這裏:http://code.alibabatech.com/wiki/display/Druid/WallFilter
問:目前Druid的應用(部署)情況?
溫少:Druid是阿里巴巴監控系統Dragoon的副產品,從Dragoon監控系統的數據來看,在阿里巴巴已經部署了600多個應用。在阿里巴巴外部也有很多Druid的用戶,外部用戶沒有正式統計數據,但經常有反饋。
問:我想將其中的某個模塊(比如監控模塊)用到其他連接池,是否可以?模塊的獨立性如何?
溫少:可以通過DruidDriver把內置的Filter用在其他連接池中。在2011年上半年DruidDataSource不成熟的時候,我們也是這麼做的。在其他連接池中使用內置的Filter,需要修改jdbc-url,使用DruidDriver作爲一個ProxyDriver。
問:我想在項目中使用,應該注意哪些事項?能否用於商業項目?
溫少:Druid是一個開源項目,基於Apache 2.0協議,你可以免費自由使用。Druid只支持JDK 6以上版本,不支持JDK 1.4和JDK 5.0。
問:配置是否複雜?能否給出一個典型的配置實例?
溫少:爲了方便大家遷移,Druid的配置和DBCP是基本一致的,如果你原來是使用DBCP,遷移是十分方便的,只需要把corg.apache.commons.dbcp.BasicDataSource修改爲om.alibaba.druid.pool.DruidDataSource就好了。
以下是一個參考配置:
<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>
問:我目前使用其他連接池(DBCP/C3P0/Proxool等),如何遷移到Druid?
Druid網站上提供了Druid/DBCP/C3P0/JBoss/WebLogic的參數對照表,通過這個對照表來遷移你目前的配置。
問:其他開發者如何反饋問題、提交bug?
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow