Spring编程式事务处理不当引起的连接泄露事件

某一日正在孜孜不倦的研究代码,忽然测试童鞋说系统服务挂了,完全不可用。

程序大量抛出如下异常:

对于程序员来说,系统宕机就是军令,更可况是难得一见的连接池泄露问题。因为在企业级的Java项目中,一般采用连接池技术和Spring的事务管理技术来处理数据访问需求,而这两项技术都是久经考验的成熟可靠技术,出问题的几率很小。

其实从异常堆栈来看,明确指出连接池中的连接全部处于激活使用的状态

按照我个人经验来说,连接耗尽可能有两种原因:

1. 系统负载很高,总连接数确实不够用,因此资源耗尽。

2. 数据库连接出现泄漏,无法正常回收,资源只出不进,导致资源耗尽。

第一种可能性很好验证,调整连接池配置参数`maxActive=500`,观察系统是否健康运行。但调整之后验证失败,500个连接依然迅速耗尽,那基本上确认是连接泄露问题。

首先要定位可能导致连接泄露的代码位置,查看系统运行日志,果然从中找出蛛丝马迹(注:资源使用的异常处理机制非常重要不可或缺,否则大海捞针全靠猜)。

日志中发现ERROR信息:

这个ERROR连续出现N次之后,系统抛出CannotGetJdbcConnectionException,猜测很有可能问题就出现在这里。

`No value for key`的告警信息初始体现在Spring框架TransactionSynchronizationManager的unbindResource方法中,源码如下:

从源码中可以看出,Spring在线程中unbind resource时,发现待处理的key不存在,抛出异常,终止了资源释放处理过程。

Spring的资源释放流程简图如下:

了解了这个过程之后,仔细分析异常日志中的代码行数,发现其中有一行编程式的事务处理代码:

具体为什么写这一行,在这里就不再赘述了。但是因为这个编程式的事务处理逻辑不当,错误的unbind dataSource,导致后续Spring的资源处理过程中(上图第2步)处理失败,无法继续回收数据库连接,连接只能获取不能回收,因此资源池迅速耗尽。

问题基本上已经明确解决,但因此衍生的思考是Spring的事务处理机制原理。

每一次线上问题的处理,都需要深刻理解背后的技术原理,多体验多分析多积累!

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏进击的程序猿

The Clean Architecture in PHP 读书笔记(六)之你不知道的MVCMVC和其的局限性

前面介绍了一些基础内容,涉及到了去耦的5大工具,本章开始讲介绍本书的重点:Clean Architecture,Clean Architecture通过我们之前...

11320
来自专栏ImportSource

并发编程-并发的简史

1.1.A(Very)Brief History of Concurrency 并发的简史 在很久以前,计算机没有操作系统;他们只执行一个程序,从头到尾的执行...

39370
来自专栏喔家ArchiSelf

NoSQL 之于大数据

关系型数据库几乎是许多开发者和DBA对于传统三层架构应用的唯一选择。使用这一场景有很多原因,数据建模方法,查询语言与数据交互,保证数据的一致性部署,并能够为复杂...

9730
来自专栏跟着阿笨一起玩NET

关于Repository模式

本文转载:http://www.cnblogs.com/dudu/archive/2011/05/25/repository_pattern.html

21910
来自专栏携程技术中心

干货 | 分布式架构系统生成全局唯一序列号的一个思路

作者简介 丁宜人,10年java开发经验。携程技术中心基础业务研发部用户中心资深java工程师,负责携程账号的基础服务和相关框架组件研发。之前在惠普公司供职6年...

593100
来自专栏木头编程 - moTzxx

小程序 微信退款功能实现讲解 (PHP方式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

65120
来自专栏北京马哥教育

一网打尽当下NoSQL类型、适用场景及使用公司

对比传统关系型数据库,NoSQL有着更为复杂的分类——键值、面向文档、列存储以及图数据库。这里就带你一览NoSQL各种类型的适用场景及一些知名公司的方案选择。 ...

37150

内存数据网格主要特性简介

将主存储器用作存储区域而不是使用磁盘是并不是一种全新的尝试。你可以在日常生活中发现许多使用主内存DBMS(数据库管理系统)(MMDB)执行比磁盘快得多的情况。一...

48940
来自专栏Java技术栈

为什么比起 IntelliJ IDEA,我更喜欢 Eclipse…

22930
来自专栏Java社区

一招 | 利用脚本不限速下载百度网盘文件

30550

扫码关注云+社区

领取腾讯云代金券