作者介绍

张馨鹏,某大型商业银行研发中心中级工程师,主要负责数据库、操作系统等基础组件的测评工作。

一、前言

应用程序访问与操作数据库,需要与数据库建立一条连接。但建立数据库连接是一个比较消耗时间和资源的过程。尤其在多并发访问时,会造成数据库连接频繁的创建与关闭,导致程序性能急剧下降,严重时可以造成应用程序崩溃。目前最常用的解决方案是使用数据库连接池管理数据库连接。

数据库连接池是数据库连接对象的缓存技术,负责分配、管理、释放数据库连接。应用程序在启动时创建指定数量的数据库连接组成数据库连接池,由应用程序动态的对池中的连接进行复用、增加和释放。连接池技术避免了重复创建和关闭数据库连接带来的消耗,极大的复用了内存资源,从而提高了程序的运行效率。

二、数据库连接池测试

1、测试背景

我司因数据库连接池的选择和使用方式的不同出现过一些问题。一般数据库连接池正确的使用方式是一个线程从连接池中取得连接后,待使用完毕后关闭连接。某项目组在使用Druid连接池时,从连接池中取得连接后,使用多线程去访问该连接,造成交易异常报错。显然这种使用方式不是推荐使用的。

当前我司开放系统端主要运行于JVM和.Net两类环境,主要使用Oracle和主机DB2两种数据库。使用的数据库连接池包括JNDI、Druid、Tomcat、Oracle UCP等。面对行内众多的数据库连接池,抛开使用方式的问题,是否存在多线程访问安全问题?是否存在较大的性能差异?以及我们该如何选择一款数据库连接池?

2、测试目的

  • 验证行内常用数据库连接池是否有多线程访问安全问题。

  • 对比行内常用数据库连接池的性能差异。

3、测试对象

  • Druid连接池:由阿里巴巴开源,我司自研框架测试环境使用的连接池。

  • JNDI连接池:由J2EE提供,WebSphere环境使用的连接池。

  • Tomcat连接池:广泛使用的开源数据库连接池。

  • UCP连接池:由Oracle开发并提供技术支持的数据库连接池。

4、测试环境

  • 服务器:JWS服务器、Tomcat服务器、WebSphere服务器。

  • 数据库:Oracle 12.0.0.12、Oracle 19C。

5、测试方法

在多服务器、多数据库环境下使用性能测试工具Jmeter进行压力测试。

1)编写测试程序

编写Java web程序,主要功能包括:多种数据库连接池配置、多线程访问连接池连接、数据库增删改查。连接池均设置为初始连接为10,最小连接为10,最大连接为100,不做其他参数配置。

2)环境部署

完成数据库Oracle12c RAC、Oracle19c RAC安装部署,应用服务器方面在SUSE 12完成WebSphere安装部署,在RHEL 7.5完成Tomcat 9部署,基于我司容器平台完成JWS部署。应用服务器和容器使用的虚拟机配置均为2核8G。

▲ 表1:测试环境

3)性能测试

使用Jmeter作为性能测试工具,分别开启20、40、80、160线程对应用程序访问连接进行压力测试,测试持续时间120秒(含启动时间)。记录测试期间应用服务器所在操作系统的CPU、内存使用率。测试结束后记录Jmeter TPS。

▲ 图1:Jmeter线程与时间设置

▲ 图2:Jmeter HTTP请求设置

4)多线程访问安全测试

测试环境与性能测试保持一致,分别开启2、4、8、16线程对应用程序多线程对连接池中一个连接进行压力测试。每种并发下重复测试3-5次,观察程序异常报错。如有报错则关闭测试,即视为多线程访问不安全。

6、性能测试结果

应用服务器Tomcat 9下连接池性能测试如下:

▲ 表2:Tomcat服务器下测试结果

应用服务器Websphere下连接池性能测试结果如下:

▲ 表3:Websphere服务器下测试结果

基于PAAS平台JWS服务器下连接池性能测试结果如下:

▲ 表4:JWS服务器下性能测试结果

7、多线程安全测试结果

▲ 表5:多线程访问安全测试

8、测试结论

通过性能测试数据可以看出,线程数越大TPS越高,但线程完成时间也越长,同时线程争抢以及等待也会增大。在相同的测试条件下,连接池Druid的CPU使用率略高。通过TPS可以看出,这四款数据库连接池并无较大的性能差异。

线程安全方面,Oracle UCP和Tomcat连接池全无异常,Druid和JNDI大部分场景均出现异常。其中Tomcat属于开源产品。UCP连接池是由Oracle官方开发提供,Oracle官方承诺UCP连接池相关服务在原厂维保内。因此,在采购Oracle原厂服务的情况下,推荐使用Oracle数据库连接池UCP。

三、正确使用数据库连接池

数据库连接池的工作过程大致如下:

1)连接池建立

应用程序启动,根据连接池配置的最小连接数,创建此数目的数据库连接放到连接池中。

2)连接池使用

应用需要访问数据库时,首先检查数据库连接池中是否有空闲连接,如果存在空闲连接,则将分配空闲连接给应用使用。如果没有空闲连接,则会检查连接池中已经使用的连接是否已经达到最大连接数,如果没达到就创建一个新的连接给应用,如果连接数已经达到最大连接数就按照设定好的最大等待时间进行等待连接释放,如果超出最大等待时间,则抛出异常。

3)连接池释放连接

应用释放数据库连接时,检查连接池是否已经达到最大连接数,如果没有则会保留在连接池中,否则从连接池中删除该连接。

根据以上过程可以看出,数据库连接池是对数据库连接进行复用、增加和释放来避免了重复创建和关闭数据库连接带来的消耗,从而提高了程序的运行效率。在多线程访问下,多线程访问同一连接是不正确使用方式。正确的使用方式是每个线程都在连接池中取用连接,使用完毕归还连接,避免长时间持有连接导致异常。

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

大型商业银行数据库连接池选型策略相关推荐

  1. JAVA常用数据库连接池

    1.连接池 池化思想是在计算机软件研发中常用的一种思想:该思想为建立一组序列,用于存放各种数据结构,从而对各种数据结构进行管理.池化的优点为:让数据结构有序化和处于控制,从而方便管理.池化本质是一种数 ...

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

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

  3. 基于JDBC的数据库连接池高效管理策略

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 在使用Java语言进行和数据库有关的的应用开发中,一般都使用JDBC来进行和数据库的交互,其中有一个关键的概念就是Con ...

  4. 数据库连接池的实现及原理

    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况 ...

  5. 数据库连接池原理及常用连接池介绍

    一.背景介绍 1.1 什么是连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个. 1.2 为什么要使用连接池 数据库连接是一种关键的有 ...

  6. 面试官:谈谈数据库连接池的原理

    来源:https://dwz.cn/oUF6pKOW 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作 1 ...

  7. 用了这么久的数据库连接池,你知道原理吗?

    作者:敦格 原文:https://blog.csdn.net/shuaihj/article/details/14223015 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及 ...

  8. Java jdbc数据库连接池

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

  9. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

最新文章

  1. Hadoop YARN
  2. 494. 目标和 golang 动态规划
  3. 北京 | 轻舟智航 招聘 感知算法工程师
  4. cmd完成拷贝文件,并生成两个快捷脚本
  5. 旅游业者泄露个人信息可被起诉
  6. R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配
  7. mysql 员工登记表_员工部门信息表-myemployees
  8. 12.3 实现一个剪贴板查看器
  9. 详解Python曲线拟合
  10. 电脑不停,电脑不停重启
  11. (014) 类函数和对象函数
  12. 谷歌浏览器调试工具使用进阶(二)
  13. Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
  14. CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录
  15. 手机性能测试指标及操作
  16. Opencv环境的配置与基本使用
  17. 乔布斯震撼临终遗言首度公开!
  18. 金海佳学C++primer 练习9.27
  19. AD学习笔记(四)PCB布局分析
  20. html鼠标移动距离,简单的鼠标移动元素近大远小效果

热门文章

  1. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]
  2. szu 寒训复习day #4数论入门详解[修改]用Mardown再改了一下
  3. php多线程多核,Linux查看CPU个数/多核/多线程的查看
  4. 开源(Open Source)那些事儿 (一)
  5. 【基础概念】 Redis简介和面试常见问题
  6. Xcode中快速定位、快速查找、快速查看文档、快速解决不再打印等技巧
  7. 服务应该去版本化,不管是微服务还是SOA
  8. ThreadLocal使用
  9. 六 Lync Server 2013 部署指南-OWA服务器部署
  10. Kernel数据结构移植(list和rbtree)