1. 程式人生 > >java連線池的maxIdle該如何配置

java連線池的maxIdle該如何配置

摘要:最近針對某系統做了次壓力測試,在併發較高的時候暴露了一個maxIdle設定不合理的問題,特總結一下這次問題,並分析一下這個問題背後的原因。

問題現象

60個執行緒併發訪問某個讀和寫均有的業務介面,效能測試人員檢視Oracle資料庫負載CPU非常高,而且oracleLogons指標達到148.1/秒(這個值的含義是資料庫客戶端登入認證的每秒的次數)。





而且檢視應用程式中的執行緒棧,也發現了較多數量的執行緒處於建立新的oracle物理連線處。



這當時就讓我有點兒糊塗了,我們不是用了連線池嗎?怎麼還會經常建立物理連線呢?

問題分析解決

遇到這個問題,我當時也是從自己掌握的各種知識裡去想可能的原因,都想到了是不是因為

tcp連線的超時時間是不是太短,仔細一想這些可能性都排除掉了。然後檢視連線池的配置,當時我們的同學告訴我這些配置跟線上的是一樣的,應該沒有問題,我當時是就懷疑是maxIdle設定太小導致的原因,但是沒有什麼具體的依據。

所以我就簡單開發了一個頁面可以實時檢視當時應用連線池的active number(當前被使用的資料庫連線數)和idle number(當前處於空閒狀態的資料庫連線數)。再次執行測試指令碼,通過檢視連線池的連線數就可以看出來,連線數的波動較大,有時候連線總數(上面兩個數字相加)從20多突然降到10,說明物理連線被銷燬了,建立了新的物理連線,那這就與我們看到的一些異常現象相吻合了,建立新的連線就會導致

oracle資料庫伺服器的logons數量增加。由於連線的複用率較差,導致頻繁的建立物理連線,oracle資料庫的資源消耗增大。

網上找到一篇文章詳細介紹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做的可能與你想像的不一樣。

maxIdlemaxActive相差較大,在高負載的系統中會導致頻繁的建立、銷燬連線,連線數在maxIdlemaxActive間快速頻繁波動,這不是我們想要的。

高負載系統的maxIdle值可以設定為與maxActive相同或設定為-1(-1表示不限制),讓連線數量在minIdlemaxIdle間緩衝慢速波動。多餘的空閒連線等待回收執行緒來緩慢回收。

至於具體多少合理取決於大家的具體應用場景,但是配置的原則是這樣的:

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