解决Tomcat数据连接池无法释放
近段时间,公司的检测中心报表系统(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如下所示:
<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
<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"/>
数据库连接设置参考:
#数据库连接设置
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
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连接池配置参数说明及优化 ,以示尊重!
解决Tomcat数据连接池无法释放的更多相关文章
- Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)
1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools: 3.new 一个Connectio P ...
- 数据连接池——JNDI
数据库连接有很多中方式,JDBC数据库的连接方式,前边我们已经介绍过了,而开发中我们经常使用的是DataBaseConnectionPool(数据库连接池,DBCP).数据库连接池到底是什么?它比jd ...
- 数据连接池JNDI
数据库连接有很多中方式,JDBC数据库的连接方式,前边我们已经介绍过了,而开发中我们经常使用的是DataBaseConnectionPool(数据库连接池,DBCP).数据库连接池到底是什么?它比jd ...
- Tomcat 配置连接池
1. Tomcat 配置 JNDI 资源 JNDI(Java Naming and Directory Interface), Java 命名和目录接口; JNDI 作用: 在服务器上配置资源, 然后 ...
- 分享一个简单的C#的通用DbHelper类(支持数据连接池)
每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...
- jdbc数据连接池dbcp要导入的jar包
jdbc数据连接池dbcp要导入的jar包 只用导入commons-dbcp-x.y.z.jarcommons-pool-a.b.jar
- python全栈开发day113-DBUtils(pymysql数据连接池)、Request管理上下文分析
1.DBUtils(pymysql数据连接池) import pymysql from DBUtils.PooledDB import PooledDB POOL = PooledDB( creato ...
- 记录一个简单的dbcp数据连接池
这个示例用到了ThreadLocal与dbcp,我觉得有点意思,就整理了下.使用dbcp,肯定要导入commons-dbcp.jar包.下面直接贴DBUtil代码: public class DBUt ...
- SpringBoot整合Druid数据连接池
SpringBoot整合Druid数据连接池 Druid是什么? Druid是Alibaba开源的的数据库连接池.Druid能够提供强大的监控和扩展功能. 在哪里下载druid maven中央仓库: ...
随机推荐
- Openwebrtc
https://github.com/EricssonResearch ============================= webrtc系列不错的博客 http://blog.csdn.net ...
- Web应用程序项目XX已配置为使用IIS
今天在看开源项目Umbraco是,出现一个项目加载不了,并报如下错误: Web应用程序项目Umbraco.Cms.Web.UI已配置为使用IIS.若要访问本地IIS网站,必须安装下列IIS组件..,如 ...
- Spring AOP /代理模式/事务管理/读写分离/多数据源管理
参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...
- ArcGIS Engine 刷新问题
link: http://www.cnblogs.com/Jingkunliu/archive/2013/01/10/2854710.html PartialRefresh方法是部分刷新,效率方面比单 ...
- 关于js中的for(var in)遍历属性报错问题
之前遇到过这个问题,但是没找到问题的所在,将for(var i in array){} 改成了for(var i ;i<array.length;i++)循环,但是今天又遇到了,mark一下错 ...
- iOS有用的三方库
DKNightVersion https://github.com/Draveness/DKNightVersion#podfile 用来为APP添加夜间模式和换肤功能
- 【SVN】Error running context: 由于目标计算机积极拒绝,无法连接
SVN服务没开启,步骤如下: 1.打开[控制面板]→[管理工具]→[服务]: 2.找到[visual SVN Sever],右击选择[启动]: 3.服务开启后,导入数据就成功了!
- css中外边距合并
最近在布局时遇到一个有趣的问题 <style> #div1{width:200px;height:200px;background:red;} #div2{width:50px;heig ...
- 国内最给力五大免费VPN商家
国内有很多提供免费VPN的商家,水平也是参差不齐,有的用心服务,为客户提供优质免费VPN线路,进而赢得客户的信任.有的则对免费线路敷衍了事,只对付费线路“尽职尽责”,从而流失大量潜在VIP客户. 笔者 ...
- 【Python全栈笔记】05 [模块二] 19 Oct 文件的操作
文件操作 一般步骤1. 文件打开 2. 文件操作 3. 文件关闭 1. 打开文件 使用open(文件名(绝对路径), 打开模式, 编码) 文件打开的模式有: r: 只读模式(默认) w: 只写模式 ...