我正在尝试执行一个耗费大量时间的查询,这有时会导致连接关闭,这意味着在查询执行/提交之前连接就会关闭。我想从错误中恢复,获取新的连接,然后重试。
Caused by: java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.OracleStatement.ensureOpen(OracleStatement.java:4051)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1473)
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406)
at com.fimt.sat.testora12date.dao.DateSaverGetterDao.testAbandonedConnectionWithDS(DateSaverGetterDao.java:73)发布于 2017-06-23 21:44:08
您可以尝试捕获此特定错误:
public save(MyData data) {
try {
...
} catch (SQLRecoverableException e) {
// Better handling a parameter to set
// the maximum number of retries
// Eventually consider to retry on a secondary thread
// delayed of a certain number of seconds
save(data);
}
}发布于 2017-06-23 21:56:35
@Davide Lorenzo MARINO的答案是很好的,除非你有一个足够重的查询,即使在几次恢复之后也不能执行。
我不是Oracle的专业人员,但我发现您可以调优某种RAC故障转移,即使在超时之后也能保持事务处理。
但通常我的愿景是,最好在多个查询中以某种方式拆分数据
发布于 2017-06-23 22:33:03
最好拆分/存储select查询中的数据,并按一定的时间间隔提交。例如,如果查询的持续时间为2个月,则存储桶/循环/拆分15天的周期,并执行必要的语句并提交
https://stackoverflow.com/questions/44722794
复制相似问题