本发明涉及数据库技术领域,特别涉及一种事务型数据库连接池的改进方法。
背景技术:
数据库连接是一种关键资源有限的资源,这点在多用户的网页应用程序中尤为突出。在nginx php-fpm模型里,每次用户访问都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。数据库连接池的解决方案是在常驻内存的swoole或者是workman等框架成熟起来的,在应用程序启动时,建立一定的数据库连接,并将这些连接组成一个连接池,每个请求会尽可能的重用连接池的连接,达到减少消耗内存池资源,节省了内存,提高了服务器的服务效率。
事务是一系列操作的集合,指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。一般来说,事务是必须满足4个条件(acid):原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。在mysql命令行的默认设置下,事务都是自动提交的,即执行sql语句后会马上提交,因此要显示开启一个事务必须使用命令begin或starttransaction,或者执行命令setautocommit=0,用来禁止使用当前会话的自动提交。事务对于以业务为主的网页应用尤为重要。
现有框架系统数据库处理方式一般为:1、使用swoole建立常驻内存,并建立静态常驻数据库连接池;2、当有请求数据库连接,数据库连接池根据池内空闲连接数量分配连接,当连接池满了,外面的连接会等待有空闲的连接;3、当某个连接的请求完成后,该连接并不会马上销毁,而是等待另一个请求进入,这样就不需要每一次请求都新建一个连接,减少io的消耗。
上述处理方式中,虽然使用数据库连接池可以减少请求数据库的连接数,但是该分案没有兼容事务型操作。要知道一个http请求进入后可能会有多次的数据库操作,这样就会有多次使用数据库连接池,要想使用事务,只能让某个数据库连接开启事务,但是由于数据库连接池的连接是只要有空闲谁的请求都可以使用,这样在一次的开启事务到事务提交的过程,可能会混杂着多个不同请求的操作,各请求相互影响最终影响了数据库的增删改操作。
技术实现要素:
本发明要解决的技术问题在于,提供一种事务型数据库连接池的改进方法,主要在于增加对事务的支持,改进后的数据库连接池既达到减少io的消耗,进入的请求也不会因事务而受到影响。
为解决上述技术问题,本发明提供如下技术方案:一种事务型数据库连接池的改进方法,包括以下步骤:
s1、创建数据库连接池,并对数据库连接池创建若干个子进程worker,并对子进程worker分配不一样的进程号;
s2、http请求对数据库连接池发起新的连接请求,每个进入数据库连接池的http请求都会被分配到其中一个子进程worker进行处理,获取子进程worker对应的进程号;数据库连接池记录进程号并进行配对和保存;
s3、当其中一个子进程worker经过多次的http请求后,对其进行销毁,并断开及销毁和其连接的所有http请求;对数据库连接池重新生成新的子进程worker并分配进程号。
进一步地,所述步骤s1还包括:启动swoole_http_server,swoole_http_server用于创建数据库连接池。
进一步地,所述步骤s2中的获取子进程worker对应的进程号,其具体为:swoole_http_server的posix_getpid进程获取子进程worker对应的进程号。
进一步地,所述步骤s2中数据库连接池记录进程号并进行配对和保存,其具体为:数据库连接池记录进程号,并以key-value方式进行配对和保存。
进一步地,所述步骤s2,在http请求对连接池发起新的连接请求前,数据库连接池会检测http请求对应子进程worker的进程号的连接请求是否在初始状态,用于防止上一次的http请求因没有关闭数据库连接池的连接请求事务而影响下一次http请求对数据库连接的操作。
进一步地,所述步骤s3中其中一个子进程worker经过多次的http请求,此处多次的具体数值为10次。
进一步地,所述步骤s3中的对数据库连接池重新生成新的子进程worker并分配进程号,其具体为:swoole_http_server的manager进程对数据库连接池重新生成新的子进程worker并分配进程号。
采用上述技术方案后,本发明至少具有如下有益效果:本发明能够对改进的数据库连接池增加事务的支持、减少io的消耗以及进入的http请求也不会因事务而受到影响。
附图说明
图1为本发明一种事务型数据库连接池的改进方法的步骤流程图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互结合,下面结合附图和具体实施例对本申请作进一步详细说明。
实施例1
swoole:面向生产环境的php异步网络通信引擎,使php开发人员可以编写高性能的异步并发tcp、udp、unixsocket、http,websocket服务。swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(iot)、车联网、智能家居等领域。使用php swoole作为网络通信框架,可以使企业it研发团队的效率大大提升,更加专注于开发创新产品。
在swoole可以发起swoole_http_server服务,进行相关功能的编译并实现功能操作,本发明是利用swoole的swoole_http_server服务实现改进事务型数据库连接池。
本实施例公开一种事务型数据库连接池的改进方法,主要是通过使用swoole_http_server创建的数据库连接池和子进程worker。如图1所示,一种事务型数据库连接池的改进方法,具体步骤为:
s11、启动swoole_http_server,swoole_http_server用于创建数据库连接池,并对数据库连接池创建若干个子进程worker,并对子进程worker分配不一样的进程号;
其中,每个进入swoole_http_server的http请求都会被分配到其中一个worker进行处理,通过posix_getpid进程可以获得某请求进入的worker的进程号(pid),而且每个worker的进程号都是不一样的;
s12、http请求对数据库连接池发起新的连接请求,每个进入数据库连接池的http请求都会被分配到其中一个子进程worker进行处理,swoole_http_server的posix_getpid进程获取子进程worker对应的进程号;数据库连接池记录进程号,并以key-value方式进行配对和保存;这样在该次http请求的整个生命周期都会只调用对应进程号的数据库连接,其它的http请求都会有对应进程号的数据库连接与之对应;
其中,在http请求对连接池发起新的连接请求前,数据库连接池会检测http请求对应子进程worker的进程号的连接请求是否在初始状态,用于防止上一次的http请求因没有关闭数据库连接池的连接请求事务而影响下一次http请求对数据库连接的操作。
s13、当其中一个子进程worker经过多次的http请求后,对其进行销毁,并断开及销毁和其连接的所有http请求;swoole_http_server的manager进程对数据库连接池重新生成新的子进程worker并分配进程号;
manager进程重新生成新的worker进程时,进程号会有所变化,这时需要销毁数据库连接池上一个进程号的数据库连接,以释放资源;
所述的多次,其为大于2次的数值,本实施例优选为10次,但并不局限于10次,具体数值根据实际情况的数据库的性能决定。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解的是,在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种等效的变化、修改、替换和变型,本发明的范围由所附权利要求及其等同范围限定。
1.一种事务型数据库连接池的改进方法,其特征在于,包括以下步骤:
s1、创建数据库连接池,并对数据库连接池创建若干个子进程worker,并对子进程worker分配不一样的进程号;
s2、http请求对数据库连接池发起新的连接请求,每个进入数据库连接池的http请求都会被分配到其中一个子进程worker进行处理,获取子进程worker对应的进程号;数据库连接池记录进程号并进行配对和保存;
s3、当其中一个子进程worker经过多次的http请求后,对其进行销毁,并断开及销毁和其连接的所有http请求;对数据库连接池重新生成新的子进程worker并分配进程号。
2.根据权利要求1所述的一种事务型数据库连接池的改进方法,其特征在于,所述步骤s1还包括:启动swoole_http_server,swoole_http_server用于创建数据库连接池。
3.根据权利要求2所述的一种事务型数据库连接池的改进方法,其特征在于,所述步骤s2中的获取子进程worker对应的进程号,其具体为:swoole_http_server的posix_getpid进程获取子进程worker对应的进程号。
4.根据权利要求2所述的一种事务型数据库连接池的改进方法,其特征在于,所述步骤s2中数据库连接池记录进程号并进行配对和保存,其具体为:数据库连接池记录进程号,并以key-value方式进行配对和保存。
5.根据权利要求1所述的一种事务型数据库连接池的改进方法,其特征在于,所述步骤s2,在http请求对连接池发起新的连接请求前,数据库连接池会检测http请求对应子进程worker的进程号的连接请求是否在初始状态,用于防止上一次的http请求因没有关闭数据库连接池的连接请求事务而影响下一次http请求对数据库连接的操作。
6.根据权利要求1所述的一种事务型数据库连接池的改进方法,其特征在于,所述步骤s3中其中一个子进程worker经过多次的http请求,此处多次的具体数值为10次。
7.根据权利要求2所述的一种事务型数据库连接池的改进方法,其特征在于,所述步骤s3中的对数据库连接池重新生成新的子进程worker并分配进程号,其具体为:swoole_http_server的manager进程对数据库连接池重新生成新的子进程worker并分配进程号。
技术总结