我有基于 java 和 spring 的 web 应用程序。它使用 Quartz 调度程序来触发存储过程。几天来它没有触发存储过程,经过检查/分析,我发现石英线程被阻塞了。这是线程转储:
“org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3”prio=10 tid=0x00002aaac40ce800 nid=0x7c85 可运行 [0x00000000430cd000] java.lang.Thread.State:在 oracle.jdbc.driver.T2CStatement.t2cParseExecuteDescribe(本机方法)处可运行) 在 oracle.jdbc.driver.T2CCallableStatement.executeForRows(T2CCallableStatement.java:765) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java: 1170) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339) 在 oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3445) - 锁定 <0x00000000e2052c30> (a oracle.jdbc.driver.T2CCallableStatement ) - 锁定 <0x00000000e2053e18> (a oracle.jdbc.driver.T2CConnection) 在 oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4394) - 锁定 <0x00000000e2052c30> (a oracle.jdbc.driver.T2CCallableStatement) - 锁定 <0x00000000e205>3 ( oracle.jdbc.driver.T2CConnection) at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:169) at com.test.server.listener.db.PersistUtil.purge(PersistUtil.java:561) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273) at org .springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob。执行内部(MethodInvokingJobDetailFactoryBean.java:264)
触发存储过程的代码:
try {
con = dataSource.getConnection();
cstmt0 = con.prepareCall("{call PURGE_METHOD}");
cstmt0.execute();
cstmt0.close();
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(cstmt0 != null){
try {
cstmt0.close();
} catch (SQLException sqle) { }
}
if(con != null){
try {
con.close();
} catch (SQLException sqle) { }
}
}
如何解决这个问题?附加信息 - 有两个 Web 应用程序实例正在运行。