一次服务上线没多久,页面处于刷新状态,系统发生假死,查看后台日志,并未发现任何的异常信息,在请求接口处增加debug日志后发现,程序在执行到数据库查询相关的地方卡死了。

怀疑是数据库连接的问题,但是使用Navicat连接数据库正常。通过jstack导出线程快照发现,

jstack <pid> >> jstack.log

大量处于WAITTING状态的线程,而这些线程都是在调用borrowObject方法,这个是apache common pool 从连接池中获取连接的方法,使用完毕调用returnObject(),将连接归还到连接池。

//所有的可用连接
private final Map<IdentityWrapper<T>, PooledObject<T>> allObjects = new ConcurrentHashMap<>(); //空闲的可用连接
private final LinkedBlockingDeque<PooledObject<T>> idleObjects; //获取可用连接
T borrowObject() throws Exception, NoSuchElementException, IllegalStateException; //资源释放(将连接放回连接池)
void returnObject(T obj) throws Exception; 

排查思路:

  1. 怀疑存在数据库连接泄漏,可能是项目代码使用完连接没有关闭。就是每次开启一个数据库连接后都需要手动关闭连接, con.close(),如果不 close 掉的话,这个连接将会一直被占用,直到连接池中的连接耗尽为止。 经排查项目代码并未发现连接未关闭。
  2. 仔细查看线程调用信息发现,获取数据库连接是由事务拦截器发起的,
 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)

查看对应的项目代码发现有个@Transactional注解,这个是spring提供的事务注解,每次执行方法时就会获取一个连接。可是此时,程序并没有和数据库相关的操作,这是个纯rest请求的类,而业务系统会定时去调用这个接口,  如果此时代码在请求rest接口的时候发生阻塞,就会导致,事务无法提交,连接也会一直被该请求占用。而再大的连接池也会被耗费殆尽。从而造成系统崩溃。

总结:正确使用@Transactional事务注解,如果方法没有涉及到数据库层面的操作,则无需开启事务,只有在需要保证数据一致性的场景才需要开启事务。这样也能减少数据库连接的压力。

common pool 数据库连接池泄露排查相关推荐

  1. mysql连接池泄露_一次线上故障:数据库连接池泄露后的思考

    作者:陈朗,普兰金融科技能效工程部开发工程师 一:初步排查 早上作为能效平台系统的使用高峰期,系统负载通常比其它时间段更大一些,某个时间段会有大量用户登录.当天系统开始有用户报障,发布系统线上无法构建 ...

  2. 一次mysql数据库连接池泄露的解决经历

    前言 最近用了公司某框架,部署到现场后,现场运维开始维护现场数据,在不断操作的过程中,系统崩溃,查看后台日志,druid连接池已经获取不到连接.于是开始了排查之旅.在此记录. 排查开始 首先后台的报错 ...

  3. 深入理解数据库连接池DBCP

    1.DBCP简介 DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需 ...

  4. eclipse mysql Xml配置_mysql8.0在eclipse中通过xml文件配置数据库连接池

    mysql8.0在eclipse中通过xml文件配置数据库连接池 1.关于Mysql8.0 2.数据库连接池(DBCP) 3.准备工作 4.配置context.xml 5.配置web.xml 6.调用 ...

  5. 数据库连接池你用了吗

    数据库连接的建立及关闭是一种极耗系统资源的操作,尤其是在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显.在工作时做系统优化对这方面的很有体会,相同功能的查询语句,由于打开关闭数据库连接的次 ...

  6. 【MySQL】数据库连接池的原理及实现

    本专栏将从基础开始,循序渐进,讲解数据库的基本概念以及使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址: 数据库必知必会 相关软件地址:软件地址 如果文章知识点有错误的地方,请指正!大家 ...

  7. java连接池 dbcp 样例_DBCP数据库连接池的简单使用

    0.DBCP简介 DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目.DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中 ...

  8. java中常用的连接池_java数据库连接池

    编写标准的数据源(规范) Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口.这样应用程序可以方便的切换不同厂商的连接池! 常见的 ...

  9. weblogic连接池不释放问题解决_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...

    作者:sneak 链接https://juejin.im/post/5ef800636fb9a07e66233884 来源:掘金 问题现象 在某个工作日,突然收到线上的服务告警,有大量的请求延时产生, ...

  10. 数据库连接池配置(案例及排查指南)

    墨墨导读:本文以 druid 1.1.5 (https://github.com/alibaba/druid) 连接池为例来阐述几个参数的重要性及如果避免踩坑,虽然下面提到的都是druid的配置项,但 ...

最新文章

  1. python-字符串数据类型内置方法
  2. 国内github访问慢的解决方法
  3. android+自定义皮肤,android studio自定义更换皮肤详细图文教程
  4. 编译libmysqlclient.a静态库
  5. python从sqlserver提取数据_通过Python读取sqlserver数据写成json文件的总结
  6. simulink模块使用记录2-EnabledSubsystem/merge
  7. 浅谈PHP-FPM参数
  8. 遥感高光谱分类文献阅读:Exploring Hierarchical Convolutional Features for Hyperspectral Image Classification
  9. (十四)java版spring cloud+spring boot+redis社交电子商务平台-在springboot中用redis实现消息队列...
  10. 二叉树的前中后序遍历(非递归实现)
  11. 图片底下配的文字叫什么_图片下面加文字 图片周边留白加文字,照片加边框并在照片下面加文字...
  12. 学校计算机社团面试问题及答案,社团二轮面试题目
  13. ubuntu 强制关闭程序或窗口方法
  14. 二级公立医院绩效考核病案首页上报系统
  15. Android Studio不使用数据线调试adb
  16. 局域网电脑打印机显示未连接到服务器,win7局域网连接打印机显示本地打印后台处理程序服务没有运行...
  17. 如何安装适用于win11的安卓子系统(WSA)的谷歌框架安卓13版本
  18. 嵌入式 wave文件(*.wav)格式、PCM数据格式收藏
  19. 网站服务器欠费,网络连接正常,显示DNS不可用是否欠费?
  20. 宝塔BT面板无法启动修复方法

热门文章

  1. c语言加加运算符是什么意思,c语言*p++是什么意思?
  2. 成也史玉柱,败也史玉柱
  3. 大数据血缘分析系统设计
  4. 利用C语言写一个等额本息的还款计算器。
  5. jpa mysql lob_Jpa加载Lob字段报Unable to access lob stream异常
  6. 制作一个简单的网页(入门篇)
  7. 重拾C语言-摄氏度与华氏度相互转换
  8. python 中的 Fraction 模块
  9. 蓝牙耳机无法与计算机连接,电脑连接蓝牙耳机时无法连接
  10. 利用Scrapy编写“1024网站种子吞噬爬虫”,送福利