数据库连接池在刷卡缴费系统高并发下的设计和调优方法分析
2021-12-25王璐
王璐
中国石油天然气股份有限公司西南油气田燃气分公司 四川 成都 610051
1 连接池的原理及技术
1.1 连接池的原理
数据库连接池主要负责分配、管理与释放数据库连接,将数据库连接对象储存其中作为“缓冲池”,连接对象从连接池中取出供用户使用。连接池内部沿用连接机制,当连接池内的对象用完了,连接池通过控制内部连接对象的个数来进行调整,只有连接池内的对象释放完毕后,等待的用户才能获取连接对象,从而操作数据库。这样可以延长连接池的使用期限,避免了数据库频繁的创建与关闭所造成的开销。工作原理具体分为三个层面:建立、治理与关闭。
1.1.1 建立连接池。应用程序中建立的连接池其实是静态的。所谓静态连接池就是指连接池中的连接在系统初始化时根据参数配置创建好数目以及确定对象放置,以便能够在需要的时候直接从连接池中获取,避免随意建立和关闭造成的开销。如java中也提供了Bean和Servlet等容器类方便构建连接池。
1.1.2 连接池的治理。连接池的治理是整体机制的核心所在。如何在连接池建立后对其中的连接进行治理,解决好池内连接的建立与关闭问题,对整个系统的运行都有重大影响。对连接进行合理分配有助于提高连接的复用率,进而加速用户的访问速度。假设连接池中分别有空闲与已分配队列,空闲队列用于存放未分配的连接,已分配队列存放正在使用的连接。当客户请求数据库连接时,要首先考虑到查看连接池中是否存在空闲连接,若存在则从中取出一个分配给客户作相应处理。如果没有则需要查看当前的连接数是否已经达到最大值,有则重新创建一个连接分配给客户,没有则需要进行等待,假如等待时长达到最大值时,则向客户反馈无空闲连接的异常信息。由此可以看出整套机制的运行可以对数据库进行有效复用,避免随意建立和关闭造成的资源开销。
1.1.3 连接池的关闭。连接池在应用程序退出的同时关闭,这时就要把连接池中的连接对象全部归还到数据库中(也就是关闭所有的数据库连接),整体过程与连接池的建立正好相反。
当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。
1.2 关键技术
1.2.1 连接池的配置。为了使系统性能达到最佳,要合理选择在数据库连接池中安置连接的个数,以及如何应对连接耗尽的情况,都是需要合理的配置策略。因此给出的策略是依据整体的硬件与软件的环境以及应用的需求,用minConn与maxConn来表示,前者为应用启动时连接池创建的连接数,后者是连接池中的最大连接数。
1.2.2 定时检测。使用连接池技术,能够极大地减少对数据库连接的多余操作,在提高程序运行效率的同时还增强了系统运行的稳定性。连接池通过定时对系统中的连接对象状态与连接数进行判断继而进行下一步操作,实现了自我管理,具体可以在连接参数中增加最大空闲时间与最大使用次数,增加时间参数来定时,如果超过最大空闲时间,则设置无效并删除,与此同时当连接数小于最小连接数时,则补充相应的新连接。
1.2.3 并发控制。在多线程环境下,为了保证连接管理服务有较强的通用性,使连接管理自身数据与连接内部的数据呈一致性。如Java语言自身提供了对并发管理的支持,提供关键字Syn2chronized以保持线程同步及安全。
1.2.4 复用连接的设计模式。该设计模式的好处在于:一是降低成本与开发时间;二是连接的对象经过测试,可靠且稳定;三是连接的对象在不同应用中保持一致。在数据库连接池中,空闲池中存放尚未分配的连接,一旦连接被分配出去,就会被放入到使用池中,当空闲池的连接全部分配出去后,从使用池中挑选一个已经正在使用的连接来复用。
2 高并发下的系统设计与研究
2.1 系统设计
2.1.1 需要使用到的技术及工具。设计该系统所需要的技术及工具主要有:一是数据库:MySQL6.62;二是开发工具Eclipse4.43;三是编程语言Java(版本1.74);四是UML建模;五是Socket通信;六是JDBC应用。
2.1.2 模块化设计。系统的设计具体分为以下几大模块:一是客户端登录,用户在进行访问前要事先与服务器进行网络连接,从而实现登录后的实时网络通信;二是服务器端管理访问,当有大量用户在同一时刻进行访问时,需要服务器端通过数据库连接池建立连接,从而能够有效处理数据访问;三是数据库查询,通过建立连接对数据库连接池中的连接对象进行查询搜索,随后将信息反馈给服务器端,服务器端再转交给客户端。
2.2 数据库连接池的测试与分析
2.2.1 有连接池与没有连接池访问的性能对比测试。在设计上述系统的过程中,出于对数据库连接池测试的目的,对用户的数据访问具体情况进行有效的统计与审核,通过线性图表的方式直观地展示出来。将有连接池与无连接池的数据进行比对,下面假定高并发下的用户数量为1000。有连接池的访问总体优于没有连接池的数据库访问,而随连接容器中的最大连接数的增多, 数据库的访问性能并不是在一直提高,而是呈现一种抛物线模 式,在30~40之间达到最高效率。
2.3 实验结果
2.3.1 数据统计。本次试验数据采用的通过模拟1000位用户访问的方法,分别对本地服务器与远程互联网服务器上的设计出来的数据库连接池做了访问实验,并通过修改数据库查询条件(从100至1000条)得到不同情况下数据库的性能指标。
2.3.2 实验结论。通过以上实验,我们可以得知,在高并发下的数据库访问中,有连接池的访问效率要远高于没有连接池(即本地连接)的访问效率。而数据库连接池的访问效率并不会随着容器中连接个数的增多而提升,相对的呈现一个单调性函数,连接池的最优连接数有一定的区域范围性,当连接池中的最大连接数高于或低于这个区间数值,都会造成数据库访问性能的下降。该最优区间还会随着访问环境的变化而产生变动。数据库连接初始化又非常的耗费资源,所以每当出现性能问题时,仅仅加大数据库连接池并不能起到提高性能的作用。所以这时我们就需要先将数据库连接池的容量增大一倍,观察是否可以解决性能问题,如果可以的话,再依次减少数据库连接池的值,找到性能瓶颈状态下以及最优性能时连接池容量的大小。通常来说,数据库连接池的值在小于Web容器线程值,数据库的性能会达到最优值。
3 数据库连接池调优策略
3.1 参数动态生成
连接池的首次启动是在根据用户的初始配置参数来实现的,这些参数可以根据多次实际测试并根据项目的需求来确定。因此优化数据库连接池的思路是在完成相关数据库操作之后,通过动态调整配置参数得以实现。那么为了保证连接池能够快速有效的运行,满足各个不同时间段的需要,高峰时间段用户访问量较大,为了减少资源的浪费相对应就要对连接池的容量进行动态放大;而其余时间段用户访问量较小,有必要对连接池的容量适当缩小,对可用资源进行回收,淘汰那些不太可能会用的资源。
3.2 连接池管理
当连接池启动时,连接池的管理模块也随之启动,同时在后台以守护线程的方式运行。其具体作用在于与连接池中获得较优的配置参数,实时调整数据库连接池的规模,系统会根据各个连接的使用时间,对下一个监控周期进行自主运算。依照流程,当时间间隔设置的很短时,管理模块频繁的检查连接池,当时间间隔设置很短时,管理模块频繁的检查连接池,会消耗很大的系统资源。而如果将时间间隔定义的很长,则很长时间才检查一次连接池,无法达到实时监控的效果。因此,如何设置一个合理的时间间隔,减少不必要的系统开销,是实现连接池管理模块的一个关键问题。利用均值法得到一个较合理的时间间隔。在监控时间到的时候,通过计算每一个连接的使用时间,得出连接使用时间的均值,并作为下一个监控间隔。
3.3 引进线程池
在设计的系统中出现高并发的情况下,同一个时间段内会有多个连接数据库连接池的请求。但如果每一个请求都创建一个连接来处理,可能造成的后果是因为线程过多导致系统的响应速度变慢。为了能够在高峰时间段对服务器端线程的个数进行有效处理,减少线程的个数与创建销毁过程中带来的系统开销,特引进线程池技术。线程池的作用有三个方面:一是降低资源消耗,通过重复利用已创建的线程减少造成的消耗;二是提高系统响应速度,任务不需要等待创建即可执行;三是提高线程的可管理性,对系统进行统一的分配、调优和监控。在线程池的操作过程中,首先创建任务类,继承于抽象类。在自己的任务类中重写抽象类中的虚函数。然后创建该任务类的对象,通过线程池外部接口把该任务对象放到线程池任务队列中。管理模块会选择自动分配一个空闲线程处理该任务,而非之前的创建新的线程。最终减少了创建与删除线程所引起的系统浪费。
4 结束语
随着我国互联网的迅猛发展,高并发已经成为互联网应用的一大特点,也成为互联网应用不可避免的问题,尤其是在京东618、天猫双11等高峰时段数据库服务器时刻都在应对大量数据请求。本文在高并发状况下设计系统,将有无连接池情况下的数据进行分析比对,随后为数据库连接池确定调优策略,以期连接池达到最大性能。