数据库连接泄漏是可以隐藏的东西,除非特别注意,否则将在系统高峰期最关键的阶段暴露出来。 我们将手动检查所有打开的连接是否已正确关闭。 然后,我们将提供各种代码质量插件来进行扫描和检查。 当连接通过复杂的程序结构传递时,这两个都可能会丢失可能的连接泄漏。 然后在单元测试或集成测试级别,我们可以进行检查以验证连接池中的计数,以避免这种不幸的情况,这种情况会使工程师在年末或黑色星期五忙,等等:)

在不幸的情况下,由于性能下降或整个系统崩溃(可通过JDBC连接泄漏传播),当我们怀疑连接泄漏时,如何轻松而Swift地找出罪魁祸首。 在Tomcat连接池中,我们可以使用3个属性来完成此操作。

removeAbandoned

如果数据库连接已被放弃(一段时间未使用,但尚未返回到池中),则此配置将尝试删除它。 以下配置配置了删除连接之前要等待的时间。

removeAbandonedTimeout

在尝试删除连接之前,它将花费的时间。 默认情况下为60s。

注意:当我们将此属性与目标一起使用来隔离罪魁祸首时,了解系统将在数据库上执行的最长事务所花费的平均时间很有用。 将此值设置为比该值大得多的值将避免我们捕获可能实际上在做有用工作的无辜线程,最后将被适当地关闭。

logAbandoned

以此来控制“删除删除的连接时是否应记录堆栈跟踪”。

有关这些属性的更多详细信息,请参见
https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes

如果您怀疑应用程序是否有泄漏,这些配置也可以用作安全网。 因为它将自动删除已忘记关闭的连接,并且池将进行处理以适当考虑这些,从而保持预期的最小,最大和空闲连接数。

这是我在池中删除废弃连接时捕获的示例日志。

 [ 2020 - 04 - 24 00 : 26 : 13 , 229 ] WARN {org.apache.tomcat.jdbc.pool.ConnectionPool} - Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection @5ab91385 ]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java: 1096 ) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java: 799 ) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java: 648 ) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java: 200 ) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java: 128 ) at org.lanka.carbon.user.core.jdbc.JDBCUserStoreManager.getDBConnection(JDBCUserStoreManager.java: 1187 ) at org.lanka.sample.CustomUserStoreManager.doAuthenticate(CustomUserStoreManager.java: 51 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticateInternal(AbstractUserStoreManager.java: 674 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.access$ 100 (AbstractUserStoreManager.java: 86 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 542 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 539 ) at java.security.AccessController.doPrivileged(Native Method) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticate(AbstractUserStoreManager.java: 539 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticateInternal(AbstractUserStoreManager.java: 702 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.access$ 100 (AbstractUserStoreManager.java: 86 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 542 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 539 ) at java.security.AccessController.doPrivileged(Native Method) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticate(AbstractUserStoreManager.java: 539 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 3 .run(AbstractUserStoreManager.java: 522 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 3 .run(AbstractUserStoreManager.java: 514 ) at java.security.AccessController.doPrivileged(Native Method) 

您可以在此处捕获与废弃连接创建相关的整个堆栈跟踪,这将使我们更快地找到问题的根源。

(可选)我们还可以选择使用JConsole通过JMX监视JDBC池。 为此,我们需要启用属性 jmxEnabled' ,该属性将允许从Jconsole连接到JDBC池。 完成后,它具有监视池的许多功能,甚至可以设置为在检测到连接被放弃时发出通知。

希望这可以帮助您节省一些时间进行故障排除。

干杯!

翻译自: https://www.javacodegeeks.com/2020/04/tomcat-jdbc-pool-connection-leak-catch-the-culprit.html

Tomcat JDBC池–连接泄漏–捕获罪魁祸首相关推荐

  1. java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0

    java - 使用JDBC的连接池选项:DBCP与C3P0 什么是可用于Java / JDBC的最佳连接池库? 我正在考虑2个主要候选人(免费/开源): Apache DBCP - [http://c ...

  2. 在独立Java应用程序中使用Tomcat JDBC连接池

    这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按. 您可能会在文章结尾找到本书的折扣券代码,仅适用于Java Code Geeks的读者! 请享用! 在需要数据访问权限的独立Java应用程序 ...

  3. tomcat7 mysql 连接池_Tomcat7 新的数据库连接池Tomcat jdbc pool介绍和配置

    Tomcat 在 7.0 以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp存在一些问题: (1)dbcp 是单线程的,为了保证线程安全会锁整个连接池 (2)dbcp 性能不佳 ...

  4. tomcat jdbc连接池配置属性详解之参数说明

    driverClassName 数据库驱动类,针对mysql填com.mysql.jdbc.Driver username 用户名 password 密码 maxActive 最大允许的连接数 max ...

  5. tomcat jdbc连接池的suspect、abandon操作解析

    为什么80%的码农都做不了架构师?>>>    ##Connection has been marked suspect Connection has been marked sus ...

  6. 开源数据库连接池之Tomcat内置连接池

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...

  7. 关于Tomcat与MySQL连接池问题的详解

    转载自   关于Tomcat与MySQL连接池问题的详解 研究了一天,终于有所收获,希望对大家有所帮助.首先请大家注意:这里尤其讨论Tomcat5.5版本中遇到的问题,为什么尤其单对这个版本,我一会儿 ...

  8. mysql事务锁导致tomcat崩溃_数据库连接池连接耗尽,导致tomcat请求无响应,呈现出假死状态...

    最困难的事情就是认识自己! 个人网站 ,欢迎访问! 前言:最近,测试部门的同事找到我,说他们测试时,没一会就发现服务接口请求一直无响应,Tomcat跟死掉了一样,也没有返回任何的错误响应,说让我赶紧排 ...

  9. java tomcat数据库连接池,tomcat 数据库连接池拿不到连接

    我们是 springboot1.x 的应用 用的自带的数据库连接池就是 tomcat,数据库用的是 oracle,现在发生了一些奇怪的事就是初始化数据库连接池的时候可能会卡在创建连接那一步,但是重启可 ...

最新文章

  1. turtle文库 ——python
  2. 教育部发文:AI、算法等2018年进入全国高中课程!
  3. Android stadio bug
  4. display:inline、block、inline-block的区别以及该死的ie6兼容问题
  5. flex 关键词过滤 2.5.35
  6. 5分钟图解Hbase列式存储
  7. vue2.x 在引用插件的时候,npm run dev跑正常 ,npm run build 报错vue-cli Unexpected token: punc (() [...
  8. 国资委发文!10本书讲透数字化时代新机遇
  9. Binary Tree Level Order Traversal II --leetcode C++
  10. AAA验证和ciscorescue v4.2 验证服务器的搭建(telnet方式和级别的设置)
  11. 一起谈.NET技术,编写T4模板无法避免的两个话题:quot;Assembly Lockingquot;amp;quot;Debugquot;...
  12. es6 prototype 属性和__proto__属性
  13. 给定字符串,实现大小写之间的转换
  14. 诺基亚E72_RM-530刷机包023.002版
  15. 41. 后台模块开发(6)
  16. vscode中查看二进制文件
  17. 计算机组成原理与汇编语言设计,计算机组成原理与汇编语言网络教学整体设计方案...
  18. BGA返修台使用说明
  19. 量化投资学习-21:板块一起大跌,却轮动上涨的背后逻辑
  20. 微信公众平台被动回复用户消息开发全步骤

热门文章

  1. UOJ#244-[UER#7]短路【贪心】
  2. jzoj4788-[NOIP2016提高A组模拟9.17]序列【差分,贪心】
  3. 【2018.3.10】模拟赛之一-ssl2574Closest【深搜】
  4. 线段树-Count on a Treap-神题
  5. Hadoop生态Flume(二)安装配置
  6. Java AIO 编程
  7. Java中枚举的线程安全性及序列化问题
  8. 跟我学 Java 8 新特性之 Stream 流基础体验
  9. Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13
  10. 为什么Netty这么火?与Mina相比有什么优势?