【问题标题】:java app, thread hangs after killing MySQL connectionjava应用程序,线程在杀死MySQL连接后挂起
【发布时间】:2013-09-29 20:46:32
【问题描述】:

我有一些工作线程正在运行,包括 MySQL 和 mysql-connector-java-5.1.20。 当我杀死一些 SQL 语句(使用 mysql 客户端的 kill “connection id”)时,java 线程挂起,这应该会引发一些异常。

jstack 打印:

    "quartzBase$child#45e3dd3c_Worker-3" prio=10 tid=0x00007f960004c800 nid=0x713d runnable [0x00007f943b3a0000]
   java.lang.Thread.State: RUNNABLE
        at java.net.PlainSocketImpl.socketAvailable(Native Method)
        at java.net.PlainSocketImpl.available(PlainSocketImpl.java:472)
        - locked <0x00007f9e11fe13a8> (a java.net.SocksSocketImpl)
        at java.net.SocketInputStream.available(SocketInputStream.java:217)
        at com.mysql.jdbc.util.ReadAheadInputStream.available(ReadAheadInputStream.java:232)
        at com.mysql.jdbc.MysqlIO.clearInputStream(MysqlIO.java:981)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2426)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)
        - locked <0x00007f9e17de2b50> (a com.mysql.jdbc.JDBC4Connection)
        at com.mysql.jdbc.ConnectionImpl.rollbackNoChecks(ConnectionImpl.java:4863)
        at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4749)
        - locked <0x00007f9e17de2b50> (a com.mysql.jdbc.JDBC4Connection)
        at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:368)
        at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:323)
        at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:217)
        at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:196)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:430)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:112)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
        at $Proxy1021.process(Unknown Source)

使用jvmtop,我看到了:

JvmTop 0.8.0 alpha - 22:48:37,  amd64, 24 cpus, Linux 2.6.32-35, load avg 11.53
 http://code.google.com/p/jvmtop

 Profiling PID 27403: com.caucho.server.resin.Resin --root-dir 

  36.41% (     0.22s) com.mysql.jdbc.util.ReadAheadInputStream.available()
  33.42% (     0.20s) ....opensymphony.xwork2.conversion.impl.DefaultTypeConve()
  30.17% (     0.18s) com.mysql.jdbc.util.ReadAheadInputStream.fill()
   0.00% (     0.00s) com.rabbitmq.client.impl.Frame.readFrom()

工作线程永远不会接受新任务。

有什么想法吗?

【问题讨论】:

  • 当我杀死一些 SQL 语句(使用来自 mysql 客户端的 kill “connection id”) 当你杀死这样的 SQL 语句时,谁知道为什么,一只小猫也死了 = \
  • 为什么要通过异常呢?如果你从侧面杀死查询,我怀疑java线程等待Godot ...
  • 嗨@LuiggiMendoza,当一个任务被取消时,它在MySQL上触发的SQL不会停止执行。所以我们杀死了这个声明。
  • @Fildor 当连接被终止时,我应该看到类似“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 从服务器成功接收的最后一个数据包是 15,277 毫秒前。最后一个成功发送到服务器的数据包是 15,275 毫秒前。”并且worker会以错误状态结束任务,然后它可以接收新的任务。

标签: java mysql multithreading


【解决方案1】:

根据 MySQL documentation "kill connection thread_id" 应该终止与给定 thread_id 关联的连接。但看起来这并没有发生(在这种情况下,Java 线程将永远等待答案)。也许您可以使用某些网络工具(例如 netstat)验证连接是否实际关闭。

我之前遇到过挂起的 MySQL 连接,不得不求助于使用socketTimeout JDBC 连接参数(但要小心:socketTimeout 需要大于完成最长运行查询所需的时间)。您也可以尝试使用 QueryTimeout 来编写准备好的语句。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 2014-05-18
    • 2020-10-23
    • 2018-07-14
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多