解决Tomcat数据链接池没法释放

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

原本能够打开jconsole看看的,正好想起了以前用过的Tomcat检测工具:probe,因而直接从其余机器上scp了一个probe.war,丢到了webapps下面自动部署。web

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

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

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

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

Tomcat 链接池 没法释放的解决方法:app

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

 1 <Resource name="jdbc/smc"  
 2 
 3 type="javax.sql.DataSource"  
 4 
 5 username="user"  
 6 
 7 password="password"  
 8 
 9 driverClassName="oracle.jdbc.driver.OracleDriver"  
10 
11 maxIdle="50"  
12 
13 maxWait="2000"  
14 
15 removeAbandoned="true"  
16 
17 removeAbandonedTimeout="180"  
18 
19 validationQuery="select * from dual "  
20 
21 url="jdbc:oracle:thin:@192.168.7.98:1521:dw"  
22 
23 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 jdbc.driverClassName=oracle.jdbc.driver.OracleDriver  
 4 
 5 jdbcjdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER  
 6 
 7 jdbc.username=user  
 8 
 9 jdbc.password=pass  
10 
11 #<!-- 初始化链接 -->  
12 
13 dataSource.initialSize=10  
14 
15 #<!-- 最大空闲链接 -->  
16 
17 dataSource.maxIdle=20  
18 
19 #<!-- 最小空闲链接 -->  
20 
21 dataSource.minIdle=5  
22 
23 #最大链接数量  
24 
25 dataSource.maxActive=50  
26 
27 #是否在自动回收超时链接的时候打印链接的超时错误  
28 
29 dataSource.logAbandoned=true  
30 
31 #是否自动回收超时链接  
32 
33 dataSource.removeAbandoned=true  
34 
35 #超时时间(以秒数为单位)  
36 
37 dataSource.removeAbandonedTimeout=180  
38 
39 #<!-- 超时等待时间以毫秒为单位 -->  
40 
41 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若是设置太长那么客户端会等待好久才激发回收事件。

相关文章
相关标签/搜索