`

连接池未关闭问题的发现与解决

阅读更多

 最近项目上线,但是大下午的客服反应项目登录页面很慢,SA发现后立马重启后项目访问速度恢复。  排查问题时,发现nginx的页面访问速度都是在十秒左右,有部分二十秒,这个时间很奇怪。日志显示,项目并没有什么特殊的错误异常。跟据经验立马确认了下连接池的maxwait时间为10000,与是百分之九十肯定是项目中有连接池未关闭的操作。

    但是此项目上线已经几天,说明此未关闭的地方很隐蔽,另外项目比较大,大家一起查了下DAO的代码,也没有什么头绪,因为正常所有的DAO操作在finally都有相关close操作,对于一些需要保持连接的操作,通过keepalive,也进行了急时关闭,所以要具体问题在哪很麻烦。

    另外重启后,通过show processlist,发现此应用的连接数每天都会有一些增加,虽然不是很明显,但是每天有些增加,更坚定了我的判断。

   由于项目是在原来老有项目中基础上开发,连接池使用了原有的tomcat自带的dbcp,其配制是通过JNDI配制。记得连接池是有自动释放连接的配制,通过google,找到资料如下:

   设置数据源的removeAbandoned="true",removeAbandonedTimeout="60",logAbandoned="true"几个属性就可以了。 DBCP会自动把超过timeout时间仍未关闭的连接强制关闭,并且打出异常信息(包含打开连接的代码位置) ,其中第一参数,打开自动释放未被使用的连接,而第二参数为多长时间未被使用的连接,第三个参数打印dbcp自动关闭时,输出的log4j日志。(这些参数有些地方需要说明:1.removeAbandonedTimeout一定需要估量自己项目中某个操作最长使用的时间,其中此参数为秒。2.对于数据库连接池还是我们自己控制关闭更好些,而使用上面配制是为了帮忙找出未关闭的地方在什么地方。修正后,可以关闭这些配制。3.log4j的日志配制级别一定需要在debug以上日志才能输出)

    修改以上配制后,服务器做了一次更新。前四天很正常,都没有错误的日志。在我以为自己判断失误的情况下,今天早上来一到公司,习惯性的扫描起日志来,突然发现了一堆

org.apache.tomcat.dbcp.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2011-07-29 08:30:25 by the following code was never closed: 让我异常兴奋。然后定位到详细的日志,定位到了代码。

    查看代码后,这个BUG让我们很无语。一个同事把一些本是service判断属性是否为null的逻辑代码,放到了DAO里面,而此判断又是在DAO里面的try{}finally的外面,而DB的构造是在此DAO的外层,所以构造DB实例时,当出现此属性为NULL的情况时,会直接返回。这样跟据没有执行try{}finally里面的代码,即不存在close了。而此操作又是一个小权限的用户下,且此权限下某个特定逻辑时才会触发。这也是为什么几天都没有触发的原因。

   到此,问题得到解决,把逻辑代码提出到外层service后,问题就得到解决了。通过此次问题的解决,让我考虑的东西又多了些。代码的review,service与dao的严格区分,DAO连接关闭的处理等等

    问题解决了很开心,下面附一下默认DBCP连接池的配制参数的说明:

   maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
   maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
    minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于 minidle个数的连接,类似于jvm参数中的Xmn设置)
    maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
    poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
    maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
    minEvictableIdleTimeMillis  :连接池中连接,在时间段内一直空闲, 被逐出连接池的时(默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)
    removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
    removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)

分享到:
评论

相关推荐

    数据库连接池-连接的关闭内幕

    数据库连接池-连接的关闭内幕 介绍了数据库连接池的关闭问题和解决办法

    数据源和连接池

    在实际项目的开发中,特别是web应用程序中,如Jsp,Servlet或EJB使用JDBC直接访问数据库中的...使用数据库连接池技术是解决上述问题的最常用的方法,在许多应用服务器(如 websphere, weblogic ,jBoss)中都提供了这种技术

    SmartPool连接池组件

    SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个...

    数据库连接池原理

    数据库 连接池 原理 ...数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。

    关于数据库连接池的问题和思考

    近数据中心出了一些问题,在Mysql连接上出现了连接数量不足的问题,一时也没找到原因,然后只是找到了解决方法,因为之前程序的错误,在打开数据库之后忘记了关闭数据库,才造成了这样的问题。在这里也要提醒各位,...

    基于 MySQL 协议,Swoole 开发的MySQL数据库连接池.zip

    使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。 同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数...

    workerman写mysql连接池的实例代码

    首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用: 1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间 2、减少数据库...

    java-JSP数据库连接池的研究与实现(源代码+论文)

    针对这些突出问题,因此提出了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;...

    Java建立数据库连接池

    该模式正是为了解决资源频繁分配、释放所造成的问题的。把该模式应用到数据库连接管理领域,是建立一个数据库连接池,提供一套高效的连接分配、使用策略,终目标是实现连接的高效、安全的复用。  数据库连接池的...

    Springboot调用Oracle存储过程的几种方式.docx

    将项目中部分需要调用存储过程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项目访问数据库超过十次就会挂掉,原因是Springboot连接池数量默认为10,猜测是每次...

    Python基于多线程操作数据库相关问题分析

    解决方法:使用数据库连接池,并且每次操作都从数据库连接池获取数据库操作句柄,操作完关闭连接返回数据库连接池。 *连接数据库需要设置charset = 'utf8', use_unicode = True,不然会报中文乱码问题 *网上说解决...

    为应用程序池 DefaultAppPool 提供服务的进程关闭时间超过了限制

    为应用程序池 ‘DefaultAppPool’ 提供服务的进程关闭时间超过了限制 服务器经常产生“应用程序池 ‘DefaultAppPool’ 提供服务的进程关闭时间超过了限制。进程 ID 是 ‘2068’。”的错误,导致iis处于假死状态,经...

    Weblogic Portal应用环境调优

    四、 数据库连接池调整最佳实践 2 五、 调整TCP接受预备连接数 4 六、 修改日志记录规则 4 七、 打开Novell认证器层次结构缓存 5 八、 关闭诊断文件 5 九、 修改是JVM在Linux下的bug(可以解决任何一个域Weblogic...

    springboot分布式事务解决方案LCN

    本文来自于csdn,将从原理,调用时序图,客户端,启动类配置代理连接池,测试代码和效果这几个方面来阐述分布式事务解决方案LCN。对比LCN和saga(华为apache孵化器项目),LCN使用代理连接池封装补偿方法,saga需要...

    proxool-0.9.1.jar

    proxool-0.9.1.jar包是一个数据库连接池包,最新版解决前几个版本里在二次关闭一个rs集的时候警告等一些bug。proxool-0.9.1.jar监控在对中文监控出现乱码情况做了更改。具体是对org.logicalcobwebs.proxool.admin....

    稳定易用的完成端口组件

    如稳定性方面,连接池的释放,发送方面没有考虑只发送出半包的情况,优雅和非优雅关闭处理的问题,性能方面如内存池的选择,逻辑处理上TCP粘包处理,本组件完美的解决了这些问题,通过不同的参数配置,可适用于不同...

    SMProxy-PHP

    使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。 同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数...

    JDBC 3.0数据库开发与设计

    4.7.1 连接池数据源(Connection PoolDataSource) 4.7.2 连接池处理事件 4.7.3 三层环境下的连接池操作 4.7.4 连接池和DataSource实现 4.7.5 包含连接池的数据源配置 4.7.6 池连接对象对于语句的重新利用 ...

    基于MySQL的数据库中间件Meituan-DBProxy.zip

    解决了绑定后端连接断开时,客户端连接未及时断开的问题 屏蔽了KILL语句,避免在后端MySQL可能误KILL的问题 修改了事务内语句执行错误时,DBProxy未保留后台连接导致rollback发送到其它结点的问题...

    proxool.jar

    压缩包中包含两个jar包: proxool-0.9.1.jar proxool-cglib.jar mysql在启动后,如果一段时间内没有活动,那么将自动关闭该连接。这段时间,默认为8小时...在spring+hibernate中解决该问题, 可使用proxool这个连接池。

Global site tag (gtag.js) - Google Analytics