/ / Java-App, Thread hängt nach dem Beenden der MySQL-Verbindung - Java, MySQL, Multithreading

Java-App, Thread hängt nach dem Beenden der MySQL-Verbindung - Java, MySQL, Multithreading

Ich habe einige Worker-Threads mit MySQL ausgeführtund mysql-connector-java-5.1.20. Wenn ich eine SQL-Anweisung (mit kill "connection id" vom MySQL-Client) beende, bleibt der Java-Thread hängen, was zu einer Ausnahme führen sollte.

jstack druckt:

    "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)

Mit jvmtop habe ich Folgendes gesehen:

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()

Die Worker-Threads akzeptieren keine neuen Aufgaben.

irgendeine Idee?

Antworten:

0 für die Antwort № 1

Laut MySQL Dokumentation "kill connection thread_id" sollte das beendenVerbindung, die der angegebenen thread_id zugeordnet ist. Aber es sieht so aus, als würde das nicht passieren (in diesem Fall wartet der Java-Thread ewig auf eine Antwort). Vielleicht können Sie mit einem Netzwerk-Tool (z. B. netstat) überprüfen, ob die Verbindung tatsächlich geschlossen ist.

Ich bin zuvor auf das Aufhängen von MySQL - Verbindungen gestoßen und musste auf die Verwendung der zurückgreifen socketTimeout JDBC-Verbindungsparameter (aber Vorsicht: Das SocketTimeout muss länger sein als die Zeit, die zum Abschließen der am längsten laufenden Abfrage benötigt wird). Sie könnten auch versuchen, die zu verwenden QueryTimeout für eine vorbereitete Aussage.