美文网首页
TransactionalEventListener 踩坑记录

TransactionalEventListener 踩坑记录

作者: 蒹葭残辉 | 来源:发表于2019-12-28 23:17 被阅读0次

TransactionalEventListener 是一个复合注解,从Spring4.2+开始支持


image.png

我们通过源码看到,他继承了EventListener注解的功能,他与EventListener不同的是,他可以支持在事务提交之后再去执行对应的事件。

正好我们项目就有一处需求需要在事务提交后统一去处理一些事情,就采用了TransactionalEventListener方式去实现。直到有一天测试压测的时候,竟然死锁了,通过分析,最后得知, 真凶竟然就是在这里面。

经过一段debug源码,最后得出一个结论:

TransactionalEventListener可以保证事件触发的时候事务已经提交,但数据库连接并没有被释放,因此也没有被连接池回收。并且由于Spring的机制,在这个事件处理代码块里面,如果需要使用连接,会继续复用之前事务内的数据库连接Connection。

这就会带来以下几个问题:
1、如果对应的事件处理器里面并不需要获取数据库连接,并且对应的代码块中一旦阻塞,在高并发下,会造成连接池瞬间打满,造成系统宕机。即使没有打满,也没有及时释放出资源,在连接有限的情况下,会对系统健壮性有一定影响。
(注:作者就因为在处理器中使用了一个队列,然而队列满了一直处于等待状态,可是不幸这些等待连接的线程均占用了数据库连接,引发了死锁)
2、如果在对应的事件处理器里面需要切换数据源的话,由于事务内Spring会共用同一个数据源连接,同理,在这里面也会用同一个数据源连接,不会去重新获取连接,造成数据源切换失败!

于是本人对事件处理器代码进行改造,为了及时去释放数据库连接,决定采取异步去执行对应的处理方法,这样就能保证连接及时释放掉。而且由于是一个新的线程,数据源切换也就迎刃而解了。

相关文章

  • TransactionalEventListener 踩坑记录

    TransactionalEventListener 是一个复合注解,从Spring4.2+开始支持 我们通过源码...

  • 2020-10-19随笔 踩坑0传值

    踩坑:当值传入0时,if条件判断时候会自己转换,记录踩坑。

  • Weex入门踩坑记录

    Weex入门踩坑记录

  • Flutter 开发记录

    Flutter 开发踩坑记录(干货总结)

  • 日常bug记录

    想记录日常碰到的bug,坑踩多了,以后应该碰到坑就比较容易处理或者会少踩坑,后面会慢慢记录bug,截图bug以及最...

  • 没事请多踩踩坑!

    人生事不尽意,别人挖坑我踩坑。 请在这里留下你的踩坑记录,让别人少入坑。

  • Windows下GithubPages博客快速搭建

    Windows下开发坑总是比较多的,但是本人没Mac,只好踩一遍坑记录下。本文主要是安装过程&踩坑记录,故不对细节...

  • Retrofit Https踩坑记录

    Retrofit Https踩坑记录 前言 新司机上路,坑多,本文重点是踩坑,不详细讲retrofit用法,本文不...

  • 个人博客标签分类

    【小结】零碎的小结 【踩坑记录】报错等记录,防止再度踩坑 【总结】比较完整的总结 【想法】自己的一些想法和推论 【...

  • 踩坑记录

    如果当前页面是push出的页面,切换根视图控制器没问题;如果当前页面是present出的页面,切换跟视图控制器之前...

网友评论

      本文标题:TransactionalEventListener 踩坑记录

      本文链接:https://www.haomeiwen.com/subject/uyyeoctx.html