java app, thread hangs after killing MySQL connection -
i have worker threads running, mysql , mysql-connector-java-5.1.20. when kill sql statement ( using kill "connection id" mysql client), java thread hangs, should throw exception.
jstack prints:
"quartzbase$child#45e3dd3c_worker-3" prio=10 tid=0x00007f960004c800 nid=0x713d runnable [0x00007f943b3a0000] java.lang.thread.state: runnable @ java.net.plainsocketimpl.socketavailable(native method) @ java.net.plainsocketimpl.available(plainsocketimpl.java:472) - locked <0x00007f9e11fe13a8> (a java.net.sockssocketimpl) @ java.net.socketinputstream.available(socketinputstream.java:217) @ com.mysql.jdbc.util.readaheadinputstream.available(readaheadinputstream.java:232) @ com.mysql.jdbc.mysqlio.clearinputstream(mysqlio.java:981) @ com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:2426) @ com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2651) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2677) - locked <0x00007f9e17de2b50> (a com.mysql.jdbc.jdbc4connection) @ com.mysql.jdbc.connectionimpl.rollbacknochecks(connectionimpl.java:4863) @ com.mysql.jdbc.connectionimpl.rollback(connectionimpl.java:4749) - locked <0x00007f9e17de2b50> (a com.mysql.jdbc.jdbc4connection) @ org.apache.commons.dbcp.delegatingconnection.rollback(delegatingconnection.java:368) @ org.apache.commons.dbcp.poolingdatasource$poolguardconnectionwrapper.rollback(poolingdatasource.java:323) @ org.hibernate.transaction.jdbctransaction.rollbackandresetautocommit(jdbctransaction.java:217) @ org.hibernate.transaction.jdbctransaction.rollback(jdbctransaction.java:196) @ org.springframework.orm.hibernate3.hibernatetransactionmanager.dorollback(hibernatetransactionmanager.java:676) @ org.springframework.transaction.support.abstractplatformtransactionmanager.processrollback(abstractplatformtransactionmanager.java:845) @ org.springframework.transaction.support.abstractplatformtransactionmanager.rollback(abstractplatformtransactionmanager.java:822) @ org.springframework.transaction.interceptor.transactionaspectsupport.completetransactionafterthrowing(transactionaspectsupport.java:430) @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:112) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:172) @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:202) @ $proxy1021.process(unknown source)
using jvmtop, saw this:
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()
the worker threads never accept new tasks.
any idea?
according mysql documentation "kill connection thread_id" should terminate connection associated given thread_id. looks not happening (in case java thread wait answer forever). maybe can verify connection closed using network tool (e.g. netstat) .
i've ran hanging mysql connections before , had resort using sockettimeout jdbc connection parameter (but careful: sockettimeout needs larger time takes complete longest running query). try use querytimeout prepared statement.
Comments
Post a Comment