reactor线程阻塞引起故障

本文分析了由于Oracle JDBC驱动在执行Rollback操作时加锁导致的Reactor线程阻塞问题。当慢SQL语句执行时,这种阻塞现象尤为明显,影响前端连接的正常使用。文章最后提出了解决方案——通过异步化来缓解这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 大致线程模型:

这里写图片描述


  • jstack打印JVM堆栈,可以看到reactor线程阻塞了,导致它对应的前端连接无法使用。阻塞在了oracle驱动rollback动作,这里其实是因为oracle驱动为了保证串行请求响应而在底层加了锁,而这个通道被慢语句塞住了,所以reactor线程都塞了。
"$_NIOREACTOR-7-RW" prio=10 tid=0x00007f069856f000 nid=0xde1 waiting for monitor entry [0x00007f0677011000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1167)
    - waiting to lock <0x000000068086fbc0> (a oracle.jdbc.driver.T4CConnection)


"$_NIOREACTOR-4-RW" prio=10 tid=0x00007f069851e000 nid=0xddd waiting for monitor entry [0x00007f0677415000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1167)
    - waiting to lock <0x000000068083cf80> (a oracle.jdbc.driver.T4CConnection)


"$_NIOREACTOR-0-RW" prio=10 tid=0x00007f06984b2000 nid=0xdd9 waiting for monitor entry [0x00007f0677819000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1167)
    - waiting to lock <0x000000068081c5f0> (a oracle.jdbc.driver.T4CConnection)

这里写图片描述


  • 解决方案,异步化
    这里写图片描述

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超人汪小建(seaboat)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值