我有一个 Web 应用程序(作为 ORM,我使用 Hibernate)来填充来自 Oracle 11 DB 的数据。 在短时间内,某些 Oracle 包会变得无效,然后又恢复有效(这是遗留数据加载,在此过程中用户可以使用其他 UI)。
当数据加载完成并且用户对这些包执行任何查询时,我遇到错误:
ORA-04068: existing state of packages has been discarded ORA-04061: existing state of package "sche.pck" has been invalidated ORA-04065: not executed, altered or dropped package "sche.pck" ORA-06508: PL/SQL: could not find program unit being called: "sche.pck"
如果用户按 F5(在错误消息屏幕上),则查询将成功执行。发生此类错误时是否有办法重复用户查询?
最佳答案
是 - 尝试/捕获异常,检查异常消息,查找 ORA-04068
,如果找到,则重新运行查询。
理想情况下,您应该进行多次重试。像这样的东西:
for (int i = 0; i < 3; i++) {
try {
executeQuery();
break; //if successful;
} catch (..) {
if (!ex.getMessage().contains("ORA-06508")){
throw ex;
}
}
}
看起来有点老套,我建议尝试解决原来的问题。
更新:
似乎很多地方都必须这样做,所以上面的内容会很乏味。如果您确实无法解决底层的 oracle 问题,您可以尝试将 DataSource、Connection 和 Statement 对象包装到您自己的实现中,这些实现简单地委托(delegate)给底层对象,但在 executeQuery()
的情况下,执行重试。
关于oracle - hibernate 重复查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8062315/