Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle存储过程重新编译和Sprig SimpleJDBCall_Java_Spring_Oracle_Stored Procedures_Jdbc - Fatal编程技术网

Java Oracle存储过程重新编译和Sprig SimpleJDBCall

Java Oracle存储过程重新编译和Sprig SimpleJDBCall,java,spring,oracle,stored-procedures,jdbc,Java,Spring,Oracle,Stored Procedures,Jdbc,请帮助克服以下问题。 当我调用最近重新编译的存储过程时,我得到一个错误ORA-“ORA-04068:包的现有状态已被丢弃”。我知道,当代码中的连接关闭时,它只是返回到池中,但仍然存在于会话中。我知道其中一个可能的解决方案是捕获此错误并在catch块中再次调用过程,不知何故如下所示: callProcedure(Params params){ SimpleJdbcCall jdbcCall = getSimpleJdbcCall(); Map&l

请帮助克服以下问题。 当我调用最近重新编译的存储过程时,我得到一个错误ORA-“ORA-04068:包的现有状态已被丢弃”。我知道,当代码中的连接关闭时,它只是返回到池中,但仍然存在于会话中。我知道其中一个可能的解决方案是捕获此错误并在catch块中再次调用过程,不知何故如下所示:

    callProcedure(Params params){

         SimpleJdbcCall jdbcCall = getSimpleJdbcCall();
            Map<String, Object> results = Collections.EMPTY_MAP;
            try {
                results = jdbcCall.execute(params);
            }catch (UncategorizedSQLException ex){
                if (checkOra04067Exception(ex)){
                    callProcedure(params);
                }
            }
            return results;
        }

        private boolean checkOra04067Exception(UncategorizedSQLException ex){
            return "72000".equals(ex.getSQLException().getSQLState()) && 
                                 ex.getSQLException().getErrorCode() == 4068;
        }
callProcedure(Params-Params){
SimpleJdbcCall=getSimpleJDBCall();
映射结果=Collections.EMPTY\u Map;
试一试{
结果=jdbcCall.execute(参数);
}catch(UncategorizedSQLException-ex){
如果(检查或04067例外(ex)){
调用程序(params);
}
}
返回结果;
}
私有布尔检查ORA0467Exception(UncategorizedSQLException ex){
返回“72000”.equals(例如getSQLException().getSQLState())&&
例如:getSQLException().getErrorCode()==4068;
}
但是有没有更优雅的方法来克服这个问题,而不是真的想在使用jdbcCall.execute(params)的许多DAO对象中放置这个try-catch块。是的,我可以用try-catch为SimpleJdbcCall做一个包装,并在需要的地方注入这个包装,但也许有可能微调数据源以真正关闭连接,或者在返回到连接池后完全删除它们?或者,是否有一种解决方案可以创建任何可以验证oracle包状态并在中使用它的查询 “spring.datasource.validation query”而不是“select 1 from dual”。 提前谢谢你的帮助。 另外,我正在使用org.apache.tomcat.jdbc.pool.DataSource和oracle.jdbc.driver.OracleDriver

顺便说一句,代码有问题,因此该方法返回空结果。 它以某种方式连接到尝试捕捉块。 第一次出现错误时,将触发callProcedure(params)方法 再次在catch块中返回result,但我不知道为什么,但是result从catch块之前的调用返回。这是一张空地图

这是我可行的解决办法。 1) 扩展SimpleJDBCall 2) 重写执行方法:

public class MyJdbcCall extends SimpleJdbcCall {

    public MyyJdbcCall(DataSource dataSource) {
        super(dataSource);
    }

    public Map<String, Object> execute(SqlParameterSource parameterSource) {
        Map<String, Object> results = Collections.EMPTY_MAP;
        try {
            results = executeInternal(parameterSource);
        } catch (UncategorizedSQLException ex) {
            if (checkOra04067Exception(ex)) {
                results = executeInternal(parameterSource);
            }
        }

        return results;
    }

    private Map<String, Object> executeInternal(SqlParameterSource parameterSource) {
        return super.execute(parameterSource);
    }

    private boolean checkOra04067Exception(UncategorizedSQLException ex) {
        return SQL_STATE_72000.equals(ex.getSQLException().getSQLState())
                && ex.getSQLException().getErrorCode() == SQL_ERROR_CODE_4068;
    }
}
公共类MyJdbcCall扩展了SimpleJDCCall{
公共MyyJdbcCall(数据源数据源){
超级(数据源);
}
公共映射执行(SqlParameterSource parameterSource){
映射结果=Collections.EMPTY\u Map;
试一试{
结果=执行内部(parameterSource);
}catch(UncategorizedSQLException-ex){
如果(检查或04067例外(ex)){
结果=执行内部(parameterSource);
}
}
返回结果;
}
私有映射执行内部(SqlParameterSource parameterSource){
返回super.execute(parameterSource);
}
私有布尔检查ORA0467Exception(UncategorizedSQLException ex){
返回SQL_STATE_72000.equals(例如getSQLException().getSQLState())
&&例如:getSQLException().getErrorCode()==SQL\U错误\U代码\U 4068;
}
}