java連線池的maxIdle該如何配置
摘要:最近針對某系統做了次壓力測試,在併發較高的時候暴露了一個maxIdle設定不合理的問題,特總結一下這次問題,並分析一下這個問題背後的原因。
問題現象
用60個執行緒併發訪問某個讀和寫均有的業務介面,效能測試人員檢視Oracle資料庫負載CPU非常高,而且oracle的Logons指標達到148.1次/秒(這個值的含義是資料庫客戶端登入認證的每秒的次數)。
而且檢視應用程式中的執行緒棧,也發現了較多數量的執行緒處於建立新的oracle物理連線處。
這當時就讓我有點兒糊塗了,我們不是用了連線池嗎?怎麼還會經常建立物理連線呢?
問題分析解決
遇到這個問題,我當時也是從自己掌握的各種知識裡去想可能的原因,都想到了是不是因為
所以我就簡單開發了一個頁面可以實時檢視當時應用連線池的active number(當前被使用的資料庫連線數)和idle number(當前處於空閒狀態的資料庫連線數)。再次執行測試指令碼,通過檢視連線池的連線數就可以看出來,連線數的波動較大,有時候連線總數(上面兩個數字相加)從20多突然降到10,說明物理連線被銷燬了,建立了新的物理連線,那這就與我們看到的一些異常現象相吻合了,建立新的連線就會導致
網上找到一篇文章詳細介紹dbcp連線池配置的,它關於maxIdle的配置說明是這麼寫的。
maxIdle值與maxActive值應配置的接近。 因為,當連線數超過maxIdle值後,剛剛使用完的連線(剛剛空閒下來)會立即被銷燬。而不是我想要的空閒M秒後再銷燬起一個緩衝作用。這一點DBCP做的可能與你想像的不一樣。 若maxIdle與maxActive相差較大,在高負載的系統中會導致頻繁的建立、銷燬連線,連線數在maxIdle與maxActive間快速頻繁波動,這不是我想要的。 高負載系統的maxIdle值可以設定為與maxActive相同或設定為-1(-1表示不限制),讓連線數量在minIdle與maxIdle間緩衝慢速波動。
看到這個我明白了因為我們的配置是maxIdle配置的值是5,而maxActive配置的值為40,這樣當併發較高的時候,當連線數接近maxActive值的情況下,空閒連線數很容易超過maxIdle,很快就被連線池給主動銷燬了,這樣就導致了連線頻繁的建立,弱化了資料庫連線池的作用。
這次的效能測試然讓我深刻的感受到了資料庫連線池對的價值,使用得當,它能夠很好地複用已有的物理連線,在高併發的場景下,減少頻繁的建立和銷燬物理連線,降低系統的壓力。用得不好,它的價值就發揮不出來,就像咱們今天這個案例一樣。
為什麼是這樣的?
maxIdle的值為什麼要與maxActive的接近呢?果真如此嗎?我們還要通過原始碼來分析它背後的根本原因。
看看上圖是對dbcp連線池的獲取和歸還連線物件的流程圖的描述,通過該圖我們就一目瞭然了。
maxIdle配置總結
maxIdle值與maxActive值應配置的接近。
因為,當連線數超過maxIdle值後,剛剛使用完的連線(剛剛空閒下來)會立即被銷燬。而不是我想要的空閒M秒後再銷燬起一個緩衝作用。這一點DBCP做的可能與你想像的不一樣。
若maxIdle與maxActive相差較大,在高負載的系統中會導致頻繁的建立、銷燬連線,連線數在maxIdle與maxActive間快速頻繁波動,這不是我們想要的。
高負載系統的maxIdle值可以設定為與maxActive相同或設定為-1(-1表示不限制),讓連線數量在minIdle與maxIdle間緩衝慢速波動。多餘的空閒連線等待回收執行緒來緩慢回收。
至於具體多少合理取決於大家的具體應用場景,但是配置的原則是這樣的:
1.如果是連線池命中率(即應用在獲取連線時直接獲得已經建立物理連線的比率)優先的應用。適合連線資源較充裕的環境,可以儘可能將maxIdle設定得更大一些,多數應用設定的大一些會更加安全。
2.如果是連線資源利用率(即被使用連線佔的比率)優先的應用。適合那些連線資源緊張的環境。可以儘可能將maxIdle設定得更小一些,這樣空閒連線能夠得到更快的釋放,保持一個較小的連線,但是設定的過小的話會導致連線池命中率非常低,弱化連線池的作用。
相關推薦
java連線池的maxIdle該如何配置
摘要:最近針對某系統做了次壓力測試,在併發較高的時候暴露了一個maxIdle設定不合理的問題,特總結一下這次問題,並分析一下這個問題背後的原因。 問題現象 用60個執行緒併發訪問某個讀和寫均有的業務介面,效能測試人員檢視Oracle資料庫負載CPU非常高,而且oracle的
spring-data-mono java註解方式mongo連線池帶認證配置
import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import or
HikariCP 的Java資料庫連線池介紹及配置
HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。 原文地址:http://blog.csdn.net/clementad/article/details/46928621 官網:https://github.com/brettwooldridge/Hi
為什麼HikariCP被號稱為效能最好的Java資料庫連線池,如何配置使用
HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。 什麼?不是有C3P0/DBCP這些成熟的資料庫連線池嗎?一直用的好好的,為什麼又搞出一個BoneCP來?因為,傳說中BoneCP在快速這個特點上做到了極致,官方資料是C3P0等
druid 資料庫連線池的詳細配置
首先說一下自己程式中遇到的問題,前一段時間新寫了一個專案,主要架構改進,為前端提供介面(spring +springmvc+mybatis) 在新專案中使用的是阿里的druid連線池,配置簡單,除了資料庫地址,驅動類,使用者名稱和密碼其他一起都是預設,開始的時候由於專案更新上線頻率比較多,沒有出現太
Java 連線池(使用DBCP與C3P0)
DBCP 需要下載common-dbcp.jar和common-pool.jar。 下載網址(下載xxx-bin.zip即可): http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi http://com
DRUID 連線池的實用 配置詳解
DRUID介紹 DRUID是阿里巴巴開源平臺上一個資料庫連線池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連線和SQL的執行情況,可以說是針對監控而生的DB連線池(據說是目前最好的連線
Java連線池的基本工作原理
1、基本概念及原理 我們知道,對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配?釋放所造成的問題。為解決上述問題,可以採用資料庫連線池技術。資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,
java連線池
連線池相關概念: 對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決我們的問題,可以採用資料庫連線池技術。資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連
java連線池技術
連線池運作原理: 在實際應用開發中,特別是在WEB應用系統中,如果JSP、Servlet或EJB使用JDBC直接訪問資料庫中的資料,每一次資料訪問請求都必須經歷建立資料庫連線、開啟資料庫、存取資料和關閉資料庫連線等步驟,而連線並開啟資料庫是一件既消耗資源又費時的工作,如果頻繁發生這種資料庫操
DRUID連線池的實用 配置詳解
DRUID介紹 DRUID是阿里巴巴開源平臺上一個資料庫連線池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連線和SQL的執行情況,可以說是針對監控而生的DB連線池(據說是目前最好的連線池,不知道速度有
基於Druid資料庫連線池的資料來源配置,資料庫連線密碼加密解密
Druid的資料庫連線池配置。 <!-- 基於Druid資料庫連線池的資料來源配置 --> <bean id="dataSource" class="com.alibaba.drui
Spring連線池的常用配置
1、連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個 應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。 資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現
資料庫連線池-常用引數配置及含義
1. maxActive 連線池支援的最大連線數,這裡取值為20,表示同時最多有20個數據庫連線。一般把maxActive設定成可能的併發量就行了設 0 為沒有限制。 2. maxIdle 連線池中最多可空閒maxIdle個連線 ,這裡取值為20,表示即使沒有資料庫連線時
Java連線池詳解
http://www.javaweb1024.com/java/JavaWebzhongji/2015/06/01/736.html 對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。
SpringBoot下Druid連線池的使用配置
分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
JAVA連線Mysql資料驅動配置及demo
記一下,免得以後忘了。 系統:winXP SP3 準備工作: 1、下載mysql最新版,我的是mysql-installer-5.5.25.0.msi,這個到Mysql官網下就可以了,然後就是安裝,一路next看好提示就可以,如果安裝之前提示你需要.net framewor
java連線各種資料庫的配置檔案寫法(轉)
參考配置檔案 # 示例配置參考,涵蓋幾乎所有的主流資料庫 ############# Oracle資料庫 ######################## # 資料庫驅動名 driver=oracle.jdbc.driver.OracleDriver # 資料庫URL
C3P0連線池+MySQL的配置以及wait_timeout問題的解決
一、配置環境 spring4.2.4+mybatis3.2.8+c3p0-0.9.1.2+Mysql5.6.24 二、c3p0的配置詳解及spring+c3p0配置 1.配置詳解 <c3p0-config> < default-config>&l
連線池 druid DruidDataSource 配置
<!-- 資料來源 org.apache.commons.dbcp.BasicDataSource com.alibaba.druid.pool.DruidDataSource --><bean id="dataSource" class="com.alibaba.druid.pool.Dr