資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數制約。無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能占有的最大連線數,當應用程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中。資料庫連線池的最小連線數和最大連線數的設定要考慮到下列幾個因素:
1. 最小連線數
是連線池一直保持的資料庫連線,所以如果應用程式對資料庫連線的使用量不大,將會有大量的資料庫連線資源被浪費。
2. 最大連線數
是連線池能申請的最大連線數,如果資料庫連線請求超過此數,後面的資料庫連線請求將被加入到等待佇列中,這會影響之後的資料庫操作。
3. 最小連線數與最大連線數差距
最小連線數與最大連線數相差太大,那麼最先的連線請求將會獲利,之後超過最小連線數量的連線請求等價於建立乙個新的資料庫連線。不過,這些大於最小連線數的數
據庫連線在使用完不會馬上被釋放,它將被放到連線池中等待重複使用或是空閒超時後被釋放。
舉個例子說明連線池的運作:
假設設定了最小和最大的連線為10,20,那麼應用一旦啟動則首先開啟10個資料庫連線,但注意此時資料庫連線池的正在使用數字為0--因為你並沒有使用這些連線,而空閒的數量則是10。然後你開始登入,假設登入**使用了乙個連線進行查詢,那麼此時資料庫連線池的正在使用數字為1、空閒數為9,這並不需要從資料庫開啟連線--因為連線池已經準備好了10個給你留著呢。登入結束了,當前連線池的連線數量是多少?當然是0,因為那個連線隨著事務的結束已經返還給連線池了。然後同時有11個人在同一秒進行登入,會發生什麼:連線池從資料庫新申請(開啟)了乙個連線,連同另外的10個一併送出,這個瞬間連線池的使用數是11個,不過沒關係正常情況下過一會兒又會變成0。如果同時有21個人登入呢?那第21個人就只能等前面的某個人登入完畢後釋放連線給他。這時連線池開啟了20個資料庫連線--雖然很可能正在使用數量的已經降為0,那麼20個連線會一直保持嗎?當然不,連線池會在一定時間內關閉一定量的連線還給資料庫,在這個例子裡數字是20-10=10,因為只需要保持最小連線數就好了,而這個時間週期也是連線池裡配置的。
開源資料連線池
1 dbcp
dbcp可能是使用最多的開源連線池,原因大概是因為配置方便,而且很多開源和tomcat應用例子都是使用的這個連線池吧。這個連線池可以設定最大和最小連線,連線等 待時間等,基本功能都有。該資料連線池主要使用在spring當中整合的資料連線池:
使用評價:在具體專案應用中,發現此連線池的持續執行的穩定性還是可以,不過速度稍慢,在大併發量的壓力下穩定性有所下降,此外不提供連線池監控。
2 c3p0
c3p0是另外乙個開源的連線池,在業界也是比較有名的,這個連線池可以設定最大和最小連線,連線等待時間等,基本功能都有。
test?useunicode=true&characterencoding=utf-8">
root
"/>
10
5 使用評價:在具體專案應用中,發現此連線池的持續執行的穩定性相當不錯,在大併發量的壓力下穩定性也有一定保證, 此外不提供連線池監控。
3 proxool
proxool這個連線池可能用到的人比較少,但也有一定知名度,這個連線池可以設定最大和最小連線,連線等待時間等,基本功能都有。
但是proxool有乙個優勢--連線池監控,這是個很誘人的東西,大概的配置方式就是在web.xml中新增如下定義:
admin
org.logicalcobwebs.proxool.admin.servlet.adminservlet
admin
/admin
使用評價:在具體專案應用中,發現此連線池的持續執行的穩定性有一定問題,有乙個需要長時間跑批的任務場景任務,同樣的**
在另外2個開源連線池中成功結束,但在proxool中出現異常退出。
4 druid alibaba的資料連線池
druid的簡介
druid首先是乙個資料庫連線池。druid是目前最好的資料庫連線池,在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括dbcp、c3p0、bonecp、proxool、jboss datasource。druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。
同時druid不僅僅是乙個資料庫連線池,它包括四個部分:
druid是乙個jdbc元件,它包括三個部分:
基於filter-chain模式的外掛程式體系。
druiddatasource 高效可管理的資料庫連線池。
sqlparser
druid的功能
1、替換dbcp和c3p0。druid提供了乙個高效、功能強大、可擴充套件性好的資料庫連線池。
2、可以監控資料庫訪問效能,druid內建提供了乙個功能強大的statfilter外掛程式,能夠詳細統計sql的執行效能,這對於線上分析資料庫訪問效能有幫助。
3、資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題。druiddruiver和druiddatasource都支援passwordcallback。
4、sql執行日誌,druid提供了不同的logfilter,能夠支援common-logging、log4j和jdklog,你可以按需要選擇相應的logfilter,監控你應用的資料庫訪問情況。
5、擴充套件jdbc,如果你要對jdbc層有程式設計的需求,可以通過druid提供的filter機制,很方便編寫jdbc層的擴充套件外掛程式。
使用springmvc+mybatis+druid時需要注意增加如下包不然容易報錯
其配置如下在spring_mybatis.xml當中
init-method="init" destroy-method="close">
在web.xml當中配置檔案配置監控:
總結:
綜上所述,這幾種開源連線池各有優劣,推薦使用druid,經檢驗這種連線池效能穩定,承壓能力強。由於它具備監控功能,因此在開發測試時使用,有助於確定是否有連線沒有被關掉,可以排除一些**的效能問題。通過druid的監控sql資料的執行可以一定程度幫助開發提前發現並且優化資料庫。
java 資料來源和連線池的區別
資料來源是一種資料庫對程式設計提供的乙個介面,每個資料來源對應乙個資料庫。連線池只是存放資料庫連線物件的乙個緩衝池,需要資料連線的時候從緩衝池中取就行了。連線池可以管理資料來源。首先不存在資料庫連線池的情況下,介面邏輯直接訪問的是資料庫。每乙個請求就會訪問資料庫從而會去占用乙個資料庫連線,訪問連線過...
執行緒池和連線池的區別
一 執行緒池的原理 執行緒池,究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠...
執行緒池和連線池的區別
一 執行緒池的原理 執行緒池,究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠...