处理oracle ORA-04068:Java应用程序

时间:2017-11-12 16:18:30

标签: java stored-procedures jdbc plsql jdbi

我的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从连接池中获取。请让我知道上面的代码是否有效。或者我需要以不同的方式重新尝试。

另外,建议我当我重新尝试时,我需要创建一个新的会话或从连接池连接就足够了。

0 个答案:

没有答案