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