首页 > 其他分享 >解决Tomcat数据连接池无法释放

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

时间:2023-08-03 18:38:08浏览次数:34  
标签:释放 jdbc Tomcat 回收 dataSource removeAbandoned true 连接 连接池


近段时间,公司的检测中心报表系统(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"         /         >




数据库连接设置参考:


#数据库连接设置   


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如果设置太长那么客户端会等待很久才激发回收事件。


标签:释放,jdbc,Tomcat,回收,dataSource,removeAbandoned,true,连接,连接池
From: https://blog.51cto.com/u_6186189/6951700

相关文章

  • Linux:安装部署Tomcat和Nginx
    学习自:linux环境安装部署tomcat、nginx_ernesto_ji的博客-CSDN博客系统相关Linux服务器:Linuxrhel1.myguest.virtualbox.org 3.10.0-1160.el7.x86_64虚拟机平台:VirtualBox终端模拟器:Tabby步骤1、Linux环境安装部署Tomcat1)wget下载安装包apache-tomcat-8.5.82.tar.gz①先......
  • liunx安装tomcat10
     1、下载软件下载tomcat:https://tomcat.apache.org/查看版本与对应的jdk版本在orace官方下载对应tomcat的jdk版本  -----这里不做展示 2、解压 分别解压到指定目录 (我自己解压在/opt下,看个人需要) tar-xvfapache-tomcat-10.1.11.tar.gz-C/o......
  • Linux:安装Java以适配tomcat
    学习自:Tomcatv8.5.82搭建_幼儿园的扛把子!!的博客-CSDN博客怎样查看和tomcat对应匹配的最低jdk版本-百度经验1、查看tomcat适配的Java版本tomcat官网https://tomcat.apache.org/download-80.cgi,点击whichversion 我下载的tomcat是8.5.52,可以看到最后一列,支持的Java版本为......
  • 释放删除后未释放空间
    用户删除了大量的文件后,du命令就不会在文件系统目录中统计这些文件。如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df命令仍会统计这个被删除的文件。通过lsof命令查询处于deleted状态的文件,被删除的......
  • 18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?
    18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?1.vector越界访问下标std::vector是C++标准库中的一种动态数组,其大小可以根据需要进行调整。当你试图访问一个不存在的元素,即访问超出其当前大小范围的索引时,将会发生越界访问。在C++中,如果你使用operator[......
  • nginx1.20-tomcat9-redisson集群,好像不怎么完善
    配置信息在同一台服务器上使用nginx做反向代理与两个tomcat组成简易tomcat集群使用nginx端口80tomcat1端口21005,21080,21009tomcat2端口22005,22080,22009配置过程1.先下载apache-tomcat-9.0.78,解压到两个目录,分别为tomcat1和tomcat2根据上方配置信息分别对两个目录中的......
  • TOMCAT功能及组件简介
      一、功能     servlet是ORACLE公司为了让WEB应用程序与WEB服务器程序之间进行交互协作而制定的一个接口。协作示意图如下:  这个接口规定:WEB应用中需要被WEB服务器动态调用的程序位于Servlet接口的实现类中;WEB服务器可以访问一个WEB应用中所有实现了Servlet接口......
  • tomcat环境部署verto客户端
    tomcat环境下部署verto客户端1.generateaself-signedcertificateforTomcatusingOpenSSLStep1:Generateaprivatekeyopensslgenpkey-algorithmRSA-outprivate.keyStep2:Createacertificatesigningrequest(CSR)opensslreq-new-keyprivate.key-......
  • windows下eclipse远程调试tomcat部署的工程
    修改catalina添加以下内容,其中21888为自定义的调试端口set"JAVA_OPTS=%JAVA_OPTS%-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=21888-Djava.protocol.handler.pkgs=org.apache.catalina.webresources"正常启动tomcat后,在eclipse的debugconfiguratio......
  • IDEA中Tomcat输出乱码
    新安装的IDEA,控制台输出Tomcat日志乱码网上有很多方法,如idea启动Tomcat时控制台出现乱码的解决(亲测有效)因为我之前的IDEA使用没问题,应该就是新安装IDEA问题,在设置中搜索“encoding”,把所有搜出来的选项设为UTF-8,其中下面这条有效果如果不清楚哪里有问题,就把上面链接里的所......