解决Tomcat数据连接池无法释放

标签: tomcat 数据 释放 | 发表时间:2015-06-28 20:20 | 作者:ronin47
出处:http://www.iteye.com

近段时间,公司的检测中心报表系统(SMC)的开发人员时不时找到我,说用户老是出现无法登录的情况。前些日子因为手头上 有Jboss集群的测试工作,发现用户不能登录时,都是在Tomcat中将这个项目Reload一下就好了,不过只是治标而已,因为大概几个小时之后又会 再次出现无法登录的情况。


今天上午,开发人员小毛又找到我,要我协助将这个问题根治一下,拖太久用户难保不投诉。

简单分析了一下,每次Reload一下就能解决无法登录的情况,自然而然就想到是不是session有问题呢?于是到Tomcat的manager界面看了下,发现并没有出现session粘滞暴涨的情况。

本来可以打开jconsole看看的,正好想起了之前用过的Tomcat检测工具:probe,于是直接从其他机器上scp了一个probe.war,丢到了webapps下面自动部署。

部署完之后,打开了probe网页管理后台发现smc项目的实时 数据库连接数很高,而且只增不减!这个系统的数据池大小设置为200,此时已经是100+了,而且一直只升不降。好吧,当数据连接数达到200时,问题肯定会再次出现的。

于是我将这个问题告诉了小毛,要他自己去修改 连接池释放机制(这里用的是项目单独设定的参数)。他说试过了,没有用,问下我有没有办法。

我这人记性一直欠佳,也很少去记忆一些参数设置,问我么?还我也只能问BD、GG了。。。

最终在强大的搜索引擎的帮助下,找到了相关参数说明,通过参考修改后成功解决了问题!

Tomcat 连接池无法释放的解决方法:

编辑项目的连接池配置文件:context.xml,参考下面的【 数据库连接设置】参数说明,按照实际情况调整好各项数值,尤其是Maxidle和maxActive。并记得加上removeAbandoned=true 相关释放参数即可,我们这最终设置好的context.xml如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
<Resource name="jdbc/smc"  
          type="javax.sql.DataSource"  
          username="user"  
          password="password"  
          driverClassName="oracle.jdbc.driver.OracleDriver"  
           maxIdle="50"  
           maxWait="2000"  
           removeAbandoned="true"  
           removeAbandonedTimeout="180"  
           validationQuery="select * from dual "  
               url="jdbc:oracle:thin:@192.168.7.98:1521:dw"  
         maxActive="200"/>

数据库连接设置参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#数据库连接设置  
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver  
jdbcjdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER  
jdbc.username=user  
jdbc.password=pass  
  
#<!-- 初始化连接 -->  
dataSource.initialSize=10  
  
#<!-- 最大空闲连接 -->  
dataSource.maxIdle=20  
  
#<!-- 最小空闲连接 -->  
dataSource.minIdle=5  
  
#最大连接数量  
dataSource.maxActive=50  
  
#是否在自动回收超时连接的时候打印连接的超时错误  
dataSource.logAbandoned=true  
  
#是否自动回收超时连接  
dataSource.removeAbandoned=true  
  
#超时时间(以秒数为单位)  
dataSource.removeAbandonedTimeout=180  
  
#<!-- 超时等待时间以毫秒为单位 -->  
dataSource.maxWait=1000

附上作者的原文说明:

在配置DBCP连接池时,主要难以理解的主要有: removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait这四个参数,设置了rmoveAbandoned=true 那么在getNumActive()快要到getMaxActive()的时候,系统会进行无效的Connection的回收,回收的 Connection为removeAbandonedTimeout(默认300秒)中设置的秒数后没有使用的Connection,激活回收机制好像 是getNumActive()=getMaxActive()-2。

如果开启" removeAbandoned",那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时被触发.

举例:当maxActive=20, 活动连接为18,空闲连接为1时可以触发" removeAbandoned".但是活动连接只有在没有被使用的时间超过"removeAbandonedTimeout"时才被删除,默认300秒.在resultset中游历不被计算为被使用.

logAbandoned=true的话,将会在回收事件后,在log中打印出回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了,在调试的时候很有用。

在这里私人建议maxWait的时间不要设得太长,maxWait如果设置太长那么客户端会等待很久才激发回收事件。

通过仁兄的资料,加深了我对连接池参数的理解,非常感谢!特附上原文地址: DBCP连接池配置参数说明及优化 ,以示尊重!



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [tomcat 数据 释放] 推荐:

解决Tomcat数据连接池无法释放

- - 开源软件 - ITeye博客
近段时间,公司的检测中心报表系统(SMC)的开发人员时不时找到我,说用户老是出现无法登录的情况. 前些日子因为手头上 有Jboss集群的测试工作,发现用户不能登录时,都是在Tomcat中将这个项目Reload一下就好了,不过只是治标而已,因为大概几个小时之后又会 再次出现无法登录的情况. 今天上午,开发人员小毛又找到我,要我协助将这个问题根治一下,拖太久用户难保不投诉.

Oracle 如何释放数据库空间

- - 数据库 - ITeye博客
        当需要释放数据库空间的时候,通常的方案会用有truncate、delete、drop/re-creating等处理. 其中truncate 后会立即释放,并且不能回滚;但delete不能立即释放数据库空间,还会产生archive log.     如: Truncate table xxxx; 我们可以直接去查user_segments对应table的bytes就变小,数据库空间释放,并且不能回滚.

tomcat调优

- - 开源软件 - ITeye博客
1          概述. 本文档主要介绍了Tomcat的性能调优的原理和方法. 可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册. 2          调优分类. 由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述.

Tomcat 优化

- - 编程语言 - ITeye博客
tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈. linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入. windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入. 最大堆内存是1024m,对于现在的硬件还是偏低,实施时,还是按照机器具体硬件配置优化.

TOMCAT优化

- - 移动开发 - ITeye博客
        Tomcat是我们经常使用的 servlet容器之一,甚至很多线上产品都使用 Tomcat充当服务器. 而且优化后的Tomcat性能提升显著,本文从以下几方面进行分析优化.         一、内存优化.         默认情况下Tomcat的相关内存配置较低,这对于一些大型项目显然是不够用的,这些项目运行就已经耗费了大部分内存空间,何况大规模访问的情况.

基于Tomcat的WebSocket

- - ITeye博客
之前大概的看过WebSocket,当时Tomcat还不支持WebSocket,所以当时写了一篇基于Jetty的WebSocket实现,地址如下:. 现在Tomcat7.0.27发布了,从这个版本开始Tomcat就支持WebSocket了. Tomcat的WebSocket和Jetty的大致上差不多,大同小异,这里就简单的贴两个类吧:.

远程调试Tomcat

- - ITeye博客
  这种情况下只能通过查看远程服务器上的log来调试,如果出现unknown source说明编译的时候没有加入行号的信息,按如下修改.   a)通过javac编译时,默认相当于指定-g:source,lines,这样编译出来的class文件中会包含源代码和行号信息.   b)而通过ant编译时,默认相当于指定-g:none,这样编译出来的class文件会比较小,但是不包含任何调试信息,所以出错的时候就会打印出unknown source.

tomcat安全设置

- - Web前端 - ITeye博客
原链接: http://blog.163.com/wm_at163/blog/static/13217349020112171618892/. server.xml默认有下面一行:. 这样允许任何人只要telnet到服务器的8005端口,输入"SHUTDOWN",然后回车,服务器立即就被关掉了. 从安全的角度上考虑,我们需要把这个shutdown指令改成一个别人不容易猜测的字符串,可以同时把端口也改了.

Tomcat调优总结

- - CSDN博客研发管理推荐文章
Tomcat 优化分为系统优化,Java虚拟机调优,Tomcat本身的优化. 1.如何调整tomcat的占用内存. 1. linux 下编辑tomcat安装目录下的bin目录下的catalina.sh文件,windows下为catalina.bat. 2. 查找到tomcat内存参数一行:/ JAVA_OPTS,如果找不到则在第一行写上.

tomcat下发布solr4.5.1

- - 开源软件 - ITeye博客
1.去官网中下载最新的solr(本例solr为4.5.1)并解压.   下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/4.5.1. 2.解压后将/example/webapps/下的solr.war放入某个sevlet容器 (本例为tomcat7).