数据库连接池

来源:互联网 发布:淘宝商城怎么开店 编辑:程序博客网 时间:2024/06/10 03:53

最近程序中经常出现连接池链接拒绝的错误。因此重新学习了数据库连接池。应用访问数据库,需要与数据库建立TCP/IP链接,也就是数据库中的connection,在数据库中体现在数据库的session上,数据库连接数是有上限的,并且每次应用与数据库建立链接都要经过三次握手,是比较耗时的,因此数据库链接是一种稀缺资源。对于这种稀缺资源,有很好的解决方案就是资源池技术,把资源预先申请一部分,放入资源池,等到用的时候就直接拿来用,这就是连接池的基本思想。

既然是资源池,那么就涉及到这么几个问题,初始化资源池的时候需要创建多少资源?资源池最大容量是多少?资源池最小资源是多少?资源被使用之后何时放回?资源在资源池中空闲的时候如何处理?需要使用资源的用户大于资源池的最大容量怎么办?

那么下面就从这几方面来分析数据库连接池,使用最大连接数20 初始链接数10最小连接数5的链接池举例说明。

①在初始化的时候,需要创建多少资源?数据库连接池,比如初始化10个链接,这个就是初始连接数。这个数值越大,应用启动越慢,小了的话很多请求第一次建立链接的时候比较费时。

②当并发访问量小于10的时候,直接使用链接池中的连接,当并发访问量大于10的时候,那新来的访问就要首看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用,如果没有空闲连接并且当前所开的连接数没有达到最大连接数,那新来的访问就创建链接,比如只有10个链接15个访问,那么就创建了5个链接,这时新来的5个链接相当于没有连接池(因为需要自己进行三次握手,建立链接,效率上和自己创建链接一样),但是等到这5个访问被使用完成的时候,并不是断开链接,而是把链接放回连接池,这样就能进行链接的复用之后来的请求就能获利。

③当并发访问量再次增加,到20的时候,这时候连接池里面有20个链接都满了,并且都在被使用。

④当并发访问量继续增加的时候,比如达到22的时候,这时候要使用资源的用户大于资源池的最大容量,多出的两个链接请求怎么办?这时候是不会继续创建链接的。这两个访问就需要排队等待,这时候就用到了数据库链接池的队列。一般连接池中都有一个等待队列,这点和线程池类似。但是等待并不是无限期的等待,这里有个超时的时间也就是连接池中的最大等待时间。超过这个时间仍然没有获得链接,那么就向用户抛出异常。如果是短时间大量链接请求,吧这个等待队列满了,并且队列中的请求都没有超时,这时候再有来链接请求到达那么也会抛出异常。

⑤当访问量下降之后,比如说这时访问量是15,那么连接池中有5个链接就是处于空闲状态,资源在资源池中空闲的时候如何处理?这里设置的空闲时间,当他们处于空闲状态的时间超过空闲时间的时候,就会被关闭。防止一直占有数据库链接资源。

⑥当访问量继续降低,比如这是访问量是9的时候,这时候,连接池中的链接只有9个处于使用状态,其他的都在空闲,如果空闲的超过空闲时间也会被关闭。最终,链接池在空闲的时候会保持最小链接数。这里需要和初始连接数区分开。最小链接数应该设置多少? 这个数字代表程序空闲的时候的链接数量,如果太小程序请求时间波动较大,如果太大,链接浪费。

⑦为了提高连接池的并发,连接池支持游标复用,就是说一个链接可以被多条同样的SQL(这里同样的SQL指的是预编译的SQL)使用多次。这里statement缓存可以设置复用的次数,只要小于数据库游标数量就可以,但是不能太大,因为缓存是比较占用内存的,因为缓存中需要存储预编译的SQL。

⑧关于连接池,链接放回的问题,一般负载均衡的时候多台应用服务器,访问同一个数据库,每个应用都有一个连接池,这时候,为了保证多台应用访问数据的负载均衡,一般在使用完成的链接放回应用的时候采用轮询的策略,往回放置。

⑨关于循环执行同一条SQL接口的情况,比如循环100次,执行同一个插入语句,参数不一样,这时候会占用多少连接数?我的理解是:这时候会按照连接池缓存的statement大小来计算,比如缓存的大小是10 ,那么100/10=10就占用10次链接。

原创粉丝点击