我有一个Java应用程序无限期地挂起,间歇性地挂起,直到服务器重新启动
查看线程转储,我不知道为什么其中一个TimerThread被底层 JDBC DB2 驱动程序启动并进入 BLOCKED 状态并且Tomcat Thread进入< strong>等待状态
定时器线程&#34; Timer-140423 &#34;等待锁定Tomcat Thread&#34; tomcat-http - 38 &#34;
所持有的对象不确定为什么会发生这种情况以及如何减轻这种情况。了解解决此问题的任何方向!
我一直试图通过各种负载测试方法在较低的环境中模拟这种行为(到目前为止没有运气)。我使用的性能分析器与我在生产中出现问题时在较低环境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)
配置/环境详情:
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配置数据源,看看是否有帮助,但不确定如何测试,或者问题是否真的得到修复,以后再也不会出现(直到配置变更)