java连接池的maxIdle该如何配置

摘要:最近针对某系统做了次压力测试,在并发较高的时候暴露了一个maxIdle设置不合理的问题,特总结一下这次问题,并分析一下这个问题背后的原因。

问题现象

用60个线程并发访问某个读和写均有的业务接口,性能测试人员查看Oracle数据库负载CPU非常高,而且oracle的Logons指标达到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间缓冲慢速波动。

原文参考: http://elf8848.iteye.com/blog/1931778

看到这个我明白了因为我们的配置是maxIdle配置的值是5,而maxActive配置的值为40,这样当并发较高的时候,当连接数接近maxActive值的情况下,空闲连接数很容易超过maxIdle,很快就被连接池给主动销毁了,这样就导致了连接频繁的创建,弱化了数据库连接池的作用。

这次的性能测试然让我深刻的感受到了数据库连接池对的价值,使用得当,它能够很好地复用已有的物理连接,在高并发的场景下,减少频繁的创建和销毁物理连接,降低系统的压力。用得不好,它的价值就发挥不出来,就像咱们今天这个案例一样。

为什么是这样的?

maxIdle的值为什么要与maxActive的接近呢?果真如此吗?我们还要通过源码来分析它背后的根本原因。

看看上图是对dbcp连接池的获取和归还连接对象的流程图的描述,通过该图我们就一目了然了。

详细的原理和源码分析请看这里:http://www.myexception.cn/apache/1874092.html

maxIdle配置总结

maxIdle值与maxActive值应配置的接近。

因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁。而不是我想要的空闲M秒后再销毁起一个缓冲作用。这一点DBCP做的可能与你想像的不一样。

若maxIdle与maxActive相差较大,在高负载的系统中会导致频繁的创建、销毁连接,连接数在maxIdle与maxActive间快速频繁波动,这不是我们想要的。

高负载系统的maxIdle值可以设置为与maxActive相同或设置为-1(-1表示不限制),让连接数量在minIdle与maxIdle间缓冲慢速波动。多余的空闲连接等待回收线程来缓慢回收。

至于具体多少合理取决于大家的具体应用场景,但是配置的原则是这样的:

1.如果是连接池命中率(即应用在获取连接时直接获得已经创建物理连接的比率)优先的应用。适合连接资源较充裕的环境,可以尽可能将maxIdle设置得更大一些,多数应用设置的大一些会更加安全。

2.如果是连接资源利用率(即被使用连接占的比率)优先的应用。适合那些连接资源紧张的环境。可以尽可能将maxIdle设置得更小一些,这样空闲连接能够得到更快的释放,保持一个较小的连接,但是设置的过小的话会导致连接池命中率非常低,弱化连接池的作用。

java 数据库连接池的maxIdle该如何配置(转载非我原创)备忘相关推荐

  1. java连接池的maxIdle该如何配置

    java连接池的maxIdle该如何配置 maxIdle值与maxActive值应配置的接近. 因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁,若maxIdle与m ...

  2. java数据库连接池选择及开发配置

    一.数据库连接池概述 数据库连接的建立是一种耗时.性能低.代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能.数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序需 ...

  3. 数据库连接池的选择及其开发配置

    转载自  数据库连接池的选择及其开发配置 一.数据库连接池概述 数据库连接的建立是一种耗时.性能低.代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能.数据库连接池是系统初始化过程中创建 ...

  4. Java数据库连接池--DBCP浅析

    转载自   Java数据库连接池--DBCP浅析 前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用 ...

  5. 主流Java数据库连接池比较及前瞻

    本文转载自微信公众号「工匠小猪猪的技术世界」 主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC ...

  6. 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)

    http://developer.51cto.com/art/201807/579402.htm 主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.B ...

  7. JAVA数据库连接池实现

    转载自   JAVA数据库连接池实现 连接池的管理用了了享元模式,这里对连接池进行简单设计. 一.设计思路 1.连接池配置属性DBbean:里面存放可以配置的一些属性 2.连接池接口IConnecti ...

  8. Java 数据库连接池的技术选型都应考虑哪些要素

    为什么80%的码农都做不了架构师?>>>    数据库连接池是一个牵涉面很广的话题,对于大型系统,数据库连接池的好坏,关系到系统的性能和稳定性,因此,选好数据库连接池,是系统在架构时 ...

  9. mysql druid 多数据源_SpringBoot使用阿里数据库连接池Druid以及多数据源配置

    SpringBoot使用阿里数据库连接池Druid以及多数据源配置 引入依赖 com.alibaba druid 1.0.29 数据源配置 1.数据源 #master数据源 spring.dataso ...

最新文章

  1. C语言中文件的读写(fputc和fgetc)(putchar和getchar)
  2. Swift学习:自动引用计数
  3. 汇总|医学图像数据集
  4. 全球最小人工心脏在华中科大完成植入:58岁患者术后精神状态良好
  5. 混合云如何落地?光环有云携手AWS一触即发
  6. Spring AOP Capability and goals
  7. [luoguP1640] [SCOI2010]连续攻击游戏(二分图最大匹配)
  8. mongoose知识点总结
  9. 前端学习(3019):vue+element今日头条管理--自定义格式化面板
  10. 前端笔记-分享一个web后台登录及注册页面
  11. magicmatch java_Java-webmagic爬虫
  12. 学习廖雪峰的Python教程之Python基础
  13. android自动登录_游戏社区App (三):客户端与服务端的加密处理 和 登录
  14. numpy部分函数使用总结
  15. H3C AP状态指示灯
  16. 【MySQL】按各科成绩进行排序,并显示排名
  17. 王者荣耀有史以来被削废的英雄盘点:还记得那个超级兵吗?
  18. 使用共享收款码系统,打造微商模式经营门店是关键
  19. homeassistant mysql_给Homeassistant更换PostgreSQL数据库
  20. 荣耀手环四有计算机功能吗,荣耀手环4有什么特点 如何使用荣耀手环4

热门文章

  1. JVM调优之jhat
  2. vue 3.0 项目 目录说明
  3. 频谱图matlab找文件路径,光学图像识别相关器的MATLAB仿真
  4. java自动装箱的好处_Java自动装箱、自动拆箱
  5. 移动版差分数据共享APP,差分数据放大器,RTK差分共享猫APP(六)
  6. Thinkpad指纹设置问题
  7. 对路径 的访问被拒绝
  8. Murano Deployment
  9. Wampserver Apache2.4.23本地访问正常但局域网无法访问的解决方法*
  10. Jmeter性能测试3——JMETER-脚本优化