龙空技术网

常见连接池问题测试方法及处理方案解决

Kevin乐分享 123

前言:

此刻小伙伴们对“怎么解析网站视频链接”大概比较注意,兄弟们都需要学习一些“怎么解析网站视频链接”的相关内容。那么小编在网络上网罗了一些对于“怎么解析网站视频链接””的相关内容,希望咱们能喜欢,小伙伴们一起来了解一下吧!

作者对缺陷管理系统中记录的与连接池有关问题进行了分析与总结,鉴于分析范围的限制和缺陷分析参与度的限制,可能会存在遗漏与错误,欢迎各位补充和指正。

一、什么是连接池

连接池是创建和管理连接的缓冲池技术,池中的连接准备好后,可以被任何需要它们的线程使用。常见的连接池分为socket连接池和数据库连接池。 在公司系统中部分用到连接池场景的还有cache缓存连接池、RabbitMQ连接池,用户中心连接池、刷卡交易通道连接池等等。下面我们以数据库连接池举例说明其作用和使用方法。

数据库连接池简称: dbcp (database connectionpool) 就是保存了很多数据库连接对象的对象池

数据库连接是一种关键的有限的昂贵资源,几乎所有应用都要用到数据库,一个数据库连接对象均对应一个物理数据库连接,每次操作都会打开一个物理连接,使用完后再关闭,也就是说会经常连接数据库打开关闭,这样经常连接会浪费大量的系统资源,和使系统性能低下,这在多用户网页的应用程序中尤为突出

连接池的出现,很好解决了这个问题,连接池的原理就是:在程序启动前先创建好足够多个数据库连接,并将这些连接组成一个连接池(就是指一个池里放了很多半成品数据库连接对象),当我的程序需要操作数据库时,由应用程序动态地对池中的连接进行申请,使用和释放。对于多连接池中的连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据连接池中连接的使用频率,动态地增加或减少连接池中的连接数,这些连接数都是可以在配置文件自己设置的。

二、使用数据库连接池的目的

通俗的看,连接池就是一种池化技术,就数据库连接池的目的来说,有以下三个:

1、尽可能多地重用消耗内存的资源,复用数据连接。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的资源开销。

2、提高了服务器的服务效率,能够支持更多的客户服务,提高程序运行效率。

3、可以通过其自身的管理机制来监视数据库连接的数量,使用情况等。

三、连接池相关的部分概念及实现方案

最小连接数: 是连接池一直保存的最小数据库连接数,所以如果应用程序对数据库连接使用小于该值,将会浪费大量数据库连接资源。

最大连接数: 连接池能申请到的最大连接数,如果数据库连接请求超过这个数,后面的数据库连接请求将会被送入等待队列中,会影响后续数据库操作。

空闲连接: 长连接时,有一个最大保持时间,目的是在达到一定时间不工作后对资源进行回收

池化技术: (缓存/复用) 在系统初始化时预先准备好资源,有请求时分配对象去使用,空闲时对此回收但不销毁,减少了对象的反复创建、销毁所花费的时间,这在高并发的情况下很吃资源。

对于连接的管理可使用一个List,即把已经创建的连接都放入Lis中去统一管理。每当用户请求一个连接时,系统检查议个List中有没有可以分配的连接。如有就把那个最合适的连接分配给他如何能找到最合适的连接文竟将在关键议题中指出):如果没有就抛出一个异常给用户,List中连接是否可以被分配由一个线程来专门管理捎后我会介绍这个线程的具体实现。

四、连接池需要注意的点

1、并发问题

为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。各个编程语言自身提供了对并发管理的支持,一般使用同步和锁机制确保线程是同步的。

2、事务处理

事务具有原子性,它要求对数据库的操作符合“ALL-OR-NOTHING"原则.即对于一组SQL语句要么全做,要么全不做。例如当2个线程共用一个连接Cnnection对象,而目各线程都有自己的事务要处理时候,需要连接池Connection类提供相应的事务支持。同时我们也可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源,但是可以降低事务管理的复杂性。

3、连接池的分配与释放

连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConnection) 和最大连接数(maxConnection)等参数来控制连接池中的连接。比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建讨多,则系统启动就慢,但创建后系统的响应速度会很快,如果创建过少,则系统启动的很快,系统刚启动的一段时间响应却慢。最大连接数是连接池中允许连接的最大数目,具体设置多少,一方面要看系统的访问量,另一方面也要考虑系统资源的分配。

4、连接的管理

连接池中的连接,因为各种原因可能会失效、长时间无响应等,需要对连接的可用性进行检测,也需要对响应时间进行管理,比如设置最长响应时间,对响应慢和响应快的请求分组管理等。

五、可能出现的问题(以下案例为公司过去几年发生的问题总结出来的)

1、连接池初始化的值太小,导致服务启动时连接池不够,影响请求响应速度。

2、连接池最大值太小,导致连接池资源耗尽,请求堆积。

3、连接池最大值太大,硬件资源或者操作系统资源耗尽,导致服务大面积中断。

4、部分请求超长时间不返回,或者连接超时未能正确处理,导致连接池耗尽。 比如银联、微信等第三方的bug导致大量请求超时。 慢SQL导致数据库请求响应时间慢等。

5、操作系统/文件管理系统资源耗尽,批处理时间长、加解密时间长、CGI时间长等导致的系统socket句柄资源耗尽。

6、快速响应的高频请求和慢响应的低频请求共用锁(或其他类似共享资源),导高频请求的连接池资源耗尽。

7、连接池虚假连接,实际因系统资源不足或者其它原因已中断,但连接池未能释放后重新建立连接。 导致请求端一直使用连接池中的异常的连接。

8、第三方连接池组件的bug,比如tidb连接池、druid连接池、hikaricp连接池等发生bug

六、测试及质量管理思考

连接池实现的方案,在测试覆盖时,一般通过Mock技术模拟连接池的请求处理情况,需要考虑:

1、对第三方系统的异常和瓶颈等路径测试覆盖。 比如第三方接口长时间无响应,第三方接口响应时间超长,第三方接口触发请求重连/重试等,第三方系统主动断开部分或者全部连接。

2、连接池连接数等配置项的等价类测试覆盖。 比如零值,小值、默认值,大值(超过系统资源负载)等

3、异与系统设计的场景覆盖。比如预期的快速响应出现了慢响应,预期的低频请求出现高频情况,预期的小报文请求出现了大报文请求或者响应等

4、出现了资源瓶颈。比如CPU、内存、IO被其它进程全部极尽占用等

从质量管理的角度,需要考虑:

1、异常情况是否可以快速地感知到瓶颈和影响范围。

2、异常情况是否可以快速定位到触发原因。

3、异常是否会扩散到其它服务和功能。

4、异常是否可以自动修复或者快速修复。

测试人员在技术建设上,一方面我们在掌握需求规格的情况下,还需要不断的学习和了解系统是如何实现,利用等价类、边界值、分支覆盖、判定覆盖等方式进行充分覆盖测试。通过用例平台、用例模板等平台技术把测试覆盖知识和经验沉淀下来

另一方面需要通过缺陷管理平台,对缺陷描述、处理方法、解决方法进行追踪,进行原因分析并归档,不断积累错题库和解体库

一些常见问题有哪些实现方案,各实现方案有什么优劣势,有什么常见问题。在测试中基于不信任的态度,对可能存在的问题,历史发生过的问题进行测试验证。另一方面对系统实现方案的预设,基于历史发生过的“不可能存在”的场景进行测试验证。

标签: #怎么解析网站视频链接 #socket连接错误