• 0
  • 1
分享

一、前言

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

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

二、数据库连接池测试

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.jpg

▲ 表1:测试环境

3)性能测试

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

2.jpg

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

3.jpg

▲ 图2:Jmeter HTTP请求设置

4)多线程访问安全测试

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

6、性能测试结果

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

4.jpg

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

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

5.jpg

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

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

6.jpg

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

7、多线程安全测试结果

7.jpg

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

8、测试结论

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

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

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

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

1)连接池建立

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

2)连接池使用

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

3)连接池释放连接

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

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


版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   2023年应该说是超乎意外的寒冷,几乎算是百业凋零。充斥在各个地方各个行业的,更多的是裁员的消息,很少有以往的风风火火的招聘了。无论是金九银十还是在以往的淡季。  谁也不知道这样一个特殊的寒冬还有多久才能过去。但是无论面对什么样的局面,做好自己的准备,提高自己的能力永远是不变的策略和最有效的方法。  今天的主题是银行的业务测试岗位招聘。  应该说测试岗位招聘,在各行各业都有,但是每个行业都会因为业务的不同而有其特殊的要求。  就算是金融测试,银行测试这个圈子里,不同类型的测试岗位,要求也不尽相同。  我们来看几个例子:  在这个例子当中,很明显是一个入门级别的国内银行的业务测试岗位。对于这...
            0 0 1028
            分享
          •   产品出了问题,谁都不想担这个责任,那么锅由谁来背呢?  背锅侠No1:测试人员  在以往的工作中发现,只要线上有bug,或者有哪个功能没测到,都被认为就是测试的问题。之前做过一个项目,在项目验收阶段,客户对下单的流程提出了一些优化性的建议,但是在开发人员开发完这个需求之后,并没有通知我进行测试,就导致在下一次给客户演示的时候,下单流程根本不通,让客户非常失望。  就这样甩锅之路又开始了,开发说是功能已经做好了,但是是测试没有测出问题来,测试又说并没有被通知到这个已经改好了需要测试,那么到底是谁的问题呢?其实严格说起来开发和测试都有责任的。  1、开发人员在功能完成之后应该及时的通知到测试人...
            0 0 1209
            分享
          •   Google地图正在改变处理位置数据的方式,不久后将把数据存储在本地设备上,而不是备份到云端。Google在发给用户的一封电子邮件中说,在Google开始删除旧数据之前,用户必须在 12 月 1 日之前把你所有的旅行记录保存到你的移动设备上。时间轴(Timeline)--以前被称为"位置历史记录"--是一项基于手机位置追踪路线和行程的功能,可以让你重访过去去过的所有地方。  但现在,该公司不再将所有这些信息与Google账户绑定,而是将其与用户使用的设备挂钩。Google于 2023 年 12 月首次宣布了这一变化,作为其加倍保护隐私的努力的一部分。此前,该公司已开始从...
            0 0 590
            分享
          • 我司是从2013年开始做接口自动化,那时候选用了测试接口工具--SoapUI。当时觉得非常好用,简单易上手,即使是代码小白,也能通过几次培训课,上手该工具。非常适用于代码基础薄弱,仅仅懂得业务的测试团队。随着业务的发展,一个项目的接口从几十个扩大到几百个,继续使用接口工具,无疑对后期脚本的维护产生了非常大的工作量。虽然说提供界面化管理,让做接口变的简单,但是却因为无法做接口分离,导致代码耦合性太高,大家都不愿意去维护老的接口。出现了老接口的case因为调试不通,而被无情删除的情况出现。事实上,只要接口仍然被软件调用的情况下,无论是老接口还是新接口。我们都是不能随意删除的。不然所谓的可持续集成,...
            0 0 854
            分享
          •   最新版本的ModelS和ModelX可以运行数千款Steam游戏。但由于车型限制、游戏体验不佳等原因,特斯拉的这一举动遭到不少用户质疑。  马斯克不遗余力地将Steam搬上车,既是打响第三空间卡位战,探索更多软件付费服务的可能性,也是为了增加用户黏性,从而提振销量。  汽车成为第三空间的前提是实现自动驾驶。在此之前,车企在影音娱乐上的内卷,在用户看来更多属于鸡肋功能。  饱受质疑的游戏梦  拥有一间百万人民币级别的私人移动游戏厅,是一种什么样的体验?  在最近的一次假日更新中,特斯拉利用游戏秀了一把车机技术。《赛博朋克2077》这款在PC上都需要高配置的游戏,已经可以在最近两年的Model...
            0 0 1321
            分享
      • 51testing软件测试圈微信