我的PROD环境中出现以下错误。一些DB调用工作正常,但是由于包被丢弃/状态无效且有很多原因,一些调用正在抛出异常。但我无法控制重新编译包。即我只有只读访问权限。我正在使用带有连接池的Java8,JDBI和Oracle数据库。
ORA-04068: existing state of packages has been discarded ORA-04061: existing state of package body "USER.PKG_MY_PACKAGE" has been invalidated ORA-04065: not executed, altered or dropped package body "USER.PKG_MY_PACKAGE" ORA-06508: PL/SQL: could not find program being called: "USER.PKG_MY_PACKAGE" ORA-06512: at line 34
我想通过在catch块中处理此异常并从catch块重新尝试来重新尝试选项(2次)。我引用了很多论坛,连接旧的编译存储过程或对象状态为脏。所以,如果我重新尝试新连接3次,我可能不会收到此错误。请建议我新的连接将工作或新的会话将工作。我将在下面尝试这个
public void callDB(int userName, int retryCount) throws Exception {
try(Handle handle = dbInstance.open()) {
OutputParameters parameters = handle.createCall(MY_STORED_PROC).bind(0,userName).bind(1,Oracle.CURSOR);
Employee employee=parameters.getObject(2);
} catch(Exception e) {
logger.error(e);
if(retryCount!=2 && e.getMessage().contains("ORA-04068")) {
retryCount=retryCount+1;
callDB(userName, retryCount);
} else {
throw e;
}
}
}
我通过JDBI API从连接池中获取。请让我知道上面的代码是否有效。或者我需要以不同的方式重新尝试。
另外,建议我当我重新尝试时,我需要创建一个新的会话或从连接池连接就足够了。