1. 程式人生 > >Druid連接池(一)

Druid連接池(一)

功能 結合 sql語句 銷毀 prepare 連接 配置filter 更新 優化

介紹

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

支持的數據庫

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

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

擴展JDBC

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

實現

阿裏巴巴是一個重度使用關系數據庫的公司,我們在生產環境中大量的使用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環境下性能可能還好,但在真實環境中則就不好了。

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

Druid連接池(一)