/ / java aplikacja, wątek zawiesza się po zabiciu połączenia MySQL - java, mysql, wielowątkowość

aplikacja Java, wątek zawiesza się po zabiciu połączenia MySQL - Java, MySQL, wielowątkowość

Mam uruchomione wątki robocze z MySQLi mysql-connector-java-5.1.20. Kiedy zabijam niektóre instrukcje SQL (używając „kill id połączenia” z klienta mysql), wątek java zawiesza się, co powinno spowodować wyjątek.

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

Za pomocą jvmtop widziałem to:

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

Wątki robocze nigdy nie przyjmą nowych zadań.

dowolny pomysł?

Odpowiedzi:

0 dla odpowiedzi № 1

Według MySQL dokumentacja „kill connection thread_id” powinno zakończyćpołączenie powiązane z danym identyfikatorem wątku. Ale wygląda na to, że tak się nie dzieje (w takim przypadku wątek Java będzie czekał na odpowiedź na zawsze). Być może możesz sprawdzić, czy połączenie zostało faktycznie zamknięte za pomocą jakiegoś narzędzia sieciowego (np. Netstat).

Natrafiłem już na zawieszanie połączeń MySQL i musiałem skorzystać z socketTimeout Parametr połączenia JDBC (należy jednak zachować ostrożność: wartość parametru socketTimeout musi być większa niż czas potrzebny do wykonania najdłuższego uruchomionego zapytania). Możesz także spróbować użyć QueryTimeout na przygotowane oświadczenie.