數據庫鏈接池

概念:sql

  最原始的數據庫使用就是打開一個鏈接並進行使用,使用事後關閉鏈接釋放資源。因爲頻繁的打開和關閉鏈接對jvm包括數據庫
都有必定的資源負荷,尤爲應用壓力較大時資源佔用比較多容易產生性能問題。由此使用鏈接池的做用就顯現出來,他的原理其實不復雜:
先打開必定數量的數據庫鏈接,當使用的時候分配給調用者,調用完畢後返回給鏈接池,注意返回給鏈接池後這些鏈接並不會關閉,而是
準備給下一個調用者進行分配。由此能夠看出鏈接池節省了大量的數據庫鏈接打開和關閉的動做,對系統性能提高的益處不言而喻。

  最小鏈接--應用啓動後隨即打開的鏈接數以及後續最小維持的鏈接數。
  最大鏈接數--應用可以使用的最多的鏈接數
  鏈接增加數--應用每次新打開的鏈接個數數據庫

  舉個例子說明鏈接池的運做:
假設設置了最小和最大的鏈接爲10,20,那麼應用一旦啓動則首先打開10個數據庫鏈接,但注意此時數據庫鏈接池的正在使用數字爲0--由於你並無使用這些鏈接,而空閒的數量則是10。而後你開始登陸,假設登陸代碼使用了一個鏈接進行查詢,那麼此時數據庫鏈接池的正在使用數字爲一、空閒數爲9,這並不須要從數據庫打開鏈接--由於鏈接池已經準備好了10個給你留着呢。登陸結束了,當前鏈接池的鏈接數量是多少?固然是0,由於那個鏈接隨着事務的結束已經返還給鏈接池了。而後同時有11我的在同一秒進行登陸,會發生什麼:鏈接池從數據庫新申請(打開)了一個鏈接,連同另外的10個一併送出,這個瞬間鏈接池的使用數是11個,不過不要緊正常狀況下過一下子又會變成0。若是同時有21我的登陸呢?那第21我的就只能等前面的某我的登陸完畢後釋放鏈接給他。這時鏈接池開啓了20個數據庫鏈接--雖然極可能正在使用數量的已經降爲0,那麼20個鏈接會一直保持嗎?固然不,鏈接池會在必定時間內關閉必定量的鏈接還給數據庫,在這個例子裏數字druid是20-10=10,由於只須要保持最小鏈接數就行了,而這個時間週期也是鏈接池裏配置的。jvm

  常見開源數據鏈接池:性能

1)DBCP優化

  DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫鏈接池.DBCP能夠直接的在應用程序中使用,Tomcat的數據源使用的就是DBCP。ui

2)c3p0
  c3p0是一個開放源代碼的JDBC鏈接池,它在lib目錄中與Hibernate一塊兒發佈,包括了實現jdbc3和jdbc2擴展規範說明的Connection 和Statement 池的DataSources 對象。
3)Druid
  阿里出品,淘寶和支付寶專用數據庫鏈接池,但它不單單是一個數據庫鏈接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個 SQL Parser。支持全部JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid針對Oracle和MySql作了特別優化,好比Oracle的PS Cache內存佔用優化,MySql的ping檢測優化。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分析語義實現的。
相關文章
相關標籤/搜索