休眠重复查询

时间:2011-11-09 08:44:54

标签: oracle hibernate

我有一个Web应用程序(我使用 Hibernate 的ORM)来填充 Oracle 11 数据库中的数据。 在很短的时间内,一些Oracle软件包变得无效,然后变回有效状态(它是旧的数据加载,在此过程中用户可以使用其他UI)。

当数据加载完成并且用户对这些包执行任何查询时,我有一个错误:

  

ORA-04068:已丢弃现有的包状态ORA-04061:   软件包“sche.pck”的现有状态已失效ORA-04065:   未执行,更改或删除包“sche.pck”ORA-06508:PL / SQL:   无法找到被调用的程序单元:“sche.pck”

如果用户按F5(在错误消息屏幕上),则查询成功执行。如果有任何方法在发生此类错误时重复用户查询?

1 个答案:

答案 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()的情况下,执行重试。