Потоки таймера драйвера JDBC DB2 застряли в состоянии БЛОКИРОВАН
У меня есть приложение Java, висит неопределенно, с перерывами, пока сервер не будет перезапущен
Глядя на дампы потоков, я понятия не имею, почему один из объектов TimerThread раскручивается базовым драйвером JDBC DB2 и переходит в состояние BLOCKED, а поток Tomcat переходит в состояние WAITING.
Поток таймера " Timer-140423 " ожидает блокировки объекта, который удерживается потоком Tomcat " tomcat-http - 38 "
Не уверен, почему это произойдет и как это смягчить. Оцените любое направление для устранения этой проблемы!
Я пытался смоделировать это поведение в более низких средах с помощью различных методов нагрузочного тестирования (пока что не повезло). Анализатор производительности, который я использую, ведет себя аналогично моим нагрузочным тестам в более низких средах v/s в то время, когда проблема возникает в производстве
Нить дамп: (исключено)
"Timer-140423" #140723 daemon prio=5 os_prio=0 tid=0x00007f2b9c208000 nid=0x19012 waiting for monitor entry [0x00007f267ffba000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.ibm.db2.jcc.t4.a.l(a.java:1361)
- waiting to lock <0x0000000086226278> (a com.ibm.db2.jcc.t4.b)
at com.ibm.db2.jcc.am.fd.a(fd.java:641)
at com.ibm.db2.jcc.am.fd.a(fd.java:306)
at com.ibm.db2.jcc.am.fd.a(fd.java:337)
at com.ibm.db2.jcc.t4.wb.a(wb.java:400)
at com.ibm.db2.jcc.t4.wb.<init>(wb.java:78)
at com.ibm.db2.jcc.t4.a.a(a.java:323)
at com.ibm.db2.jcc.t4.a.b(a.java:704)
at com.ibm.db2.jcc.am.o.a(o.java:246)
at com.ibm.db2.jcc.am.en.c(en.java:946)
at com.ibm.db2.jcc.am.mo.run(mo.java:27)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
"tomcat-http--38" #68 daemon prio=5 os_prio=0 tid=0x00007f2c6ceb8800 nid=0x11715 in Object.wait() [0x00007f281ffd1000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at com.ibm.db2.jcc.am.o.j(o.java:266)
- locked <0x0000000086226690> (a com.ibm.db2.jcc.t4.a)
at com.ibm.db2.jcc.am.fn.ec(fn.java:741)
at com.ibm.db2.jcc.am.fn.executeUpdate(fn.java:717)
- locked <0x0000000086226278> (a com.ibm.db2.jcc.t4.b)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:877)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:870)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:870)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:931)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:941)
at com.my.app.FixTheFoxDAOJdbcImpl.completedChapter(FixTheFoxDAOJdbcImpl.java:1787)
Подробности конфигурации /Env:
Java : jdk1.8.0_144
Tomcat : tomcat-8.5.13.B.RELEASE
App Server : Pivotal tcServer 3.2.5
Spring Version : 4.5.3
DB Conn Pooling : commons-dbcp-1.4.jar
Database : DB2 Version: 11.1.0
JDBC/DB2 Driver : db2jcc4-1.0.0.jar
С другой стороны, я могу, конечно, попробовать использовать tomcat-dbcp или настроить источник данных через JNDI, чтобы посмотреть, помогает ли это, но не уверен, как это проверить, или проблема действительно будет устранена и не появится снова в будущем (до тех пор, пока не произойдет изменение конфигурации)