事务导致的spring-boot 或者tomcat 假死
事务导致的spring-boot 或者tomcat 假死
外星松鼠 发表于7个月前
事务导致的spring-boot 或者tomcat 假死
  • 发表于 7个月前
  • 阅读 29
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

现象:

启动后有响应,跑一段时间后,tomat无响应。

linux上查看端口占用:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

发现 colse_wait 值特别高,先后修改了tomcat的配置参数,包括最大连接,线程数,keepaliveTimeOut等配置,都不行。

使用java自带的jstack导出线程堆栈,发现了问题,堆栈导出:

先查询程序进程id,然后使用jdk下的jstack 命令导出:

进程号:323

导出命令:

/usr/local/java/jdk1.8.0_51/bin/jstack 323 > jstack.323

然后查看jstack.323文件,发现:

大量这样的线程:

 java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006dc1d99c0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionOb
ject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2
039)
        at com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1448)
        at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1090)
        at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:960)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:940)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:930)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:102)
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConne
ctionProviderImpl.java:139)
        at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSession
Impl.java:380)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171)
        at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:450)
        at sun.reflect.GeneratedMethodAccessor189.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:216)
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:201)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle.doGetConnection(HibernateJpa
Dialect.java:414)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:177)
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra
nsactionManager.java:373)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction
AspectSupport.java:447)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspec
tSupport.java:277)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
        at com.eversec.windowtool.modules.messagecenter.service.MessageCenterService$$EnhancerBySpringCGLIB$$587dfde0.ge
tCountBySql(<generated>)

很明显跟数据库有关系,但是查看方法,发现调用的方法根本没有操作数据库,在日志可以发现问题在于:

at com.eversec.windowtool.modules.messagecenter.service.MessageCenterService$$EnhancerBySpringCGLIB$$587dfde0.ge
tCountBySql(<generated>)

是在方法的generated时,翻代码发现,这个类上加了

@Transactional

注解,也就是这个的方法在调用时,不管使用不使用数据库,都会启动事务管理

解决方法:

在需要事务管理的方法上加上该注解,不要加在类上,问题解决。

标签: tomcat假死 事务
共有 人打赏支持
粉丝 0
博文 2
码字总数 560
×
外星松鼠
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: