我有一个Web应用程序(我使用 Hibernate 的ORM)来填充 Oracle 11 数据库中的数据。 在很短的时间内,一些Oracle软件包变得无效,然后变回有效状态(它是旧的数据加载,在此过程中用户可以使用其他UI)。
当数据加载完成并且用户对这些包执行任何查询时,我有一个错误:
ORA-04068:已丢弃现有的包状态ORA-04061: 软件包“sche.pck”的现有状态已失效ORA-04065: 未执行,更改或删除包“sche.pck”ORA-06508:PL / SQL: 无法找到被调用的程序单元:“sche.pck”
如果用户按F5(在错误消息屏幕上),则查询成功执行。如果有任何方法在发生此类错误时重复用户查询?
答案 0 :(得分:3)
是 - 尝试/捕获异常,检查异常消息,查找ORA-04068
,如果找到,请重新运行查询。
理想情况下,您应该进行多次重试。类似的东西:
for (int i = 0; i < 3; i++) {
try {
executeQuery();
break; //if successful;
} catch (..) {
if (!ex.getMessage().contains("ORA-06508")){
throw ex;
}
}
}
看起来有点hacky,我建议尝试修复原来的问题。
更新:
似乎你必须在许多地方这样做,所以上述将是乏味的。如果你真的无法修复底层的oracle问题,你可以尝试将你的DataSource,Connection和Statement对象包装到你自己的实现中,只需委托给底层对象,但是在executeQuery()
的情况下,执行重试。