Oracle 休眠重复查询

Oracle 休眠重复查询,oracle,hibernate,Oracle,Hibernate,我有一个Web应用程序(如我使用的ORMHibernate),它从Oracle 11DB填充数据。 在很短的一段时间内,一些Oracle软件包变为无效,然后又变回有效(它的旧数据加载,在此过程中,用户可以使用其他UI) 当数据加载完成并且用户对这些包执行任何查询时,我有一个错误: ORA-04068:包的现有状态已被丢弃ORA-04061: 包“sche.pck”的现有状态已失效ORA-04065: 未执行、更改或删除包“sche.pck”ORA-06508:PL/SQL: 找不到正在调用的程序

我有一个Web应用程序(如我使用的ORMHibernate),它从Oracle 11DB填充数据。 在很短的一段时间内,一些Oracle软件包变为无效,然后又变回有效(它的旧数据加载,在此过程中,用户可以使用其他UI)

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

ORA-04068:包的现有状态已被丢弃ORA-04061: 包“sche.pck”的现有状态已失效ORA-04065: 未执行、更改或删除包“sche.pck”ORA-06508:PL/SQL: 找不到正在调用的程序单元:“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;
        }
    }
}
for(int i=0;i<3;i++){
试一试{
executeQuery();
break;//如果成功;
}捕获(…){
如果(!ex.getMessage()包含(“ORA-06508”)){
掷骰子;
}
}
}
看起来有点黑,我建议尝试解决原来的问题

更新:


似乎在很多地方都必须这样做,所以上面的内容会很乏味。如果您确实无法修复底层oracle问题,可以尝试将数据源、连接和语句对象包装到您自己的实现中,这些实现只是委托给底层对象,但是在
executeQuery()
的情况下,会执行重试

问题是。。。。我不能在整个应用程序中这样做!如果我使用拦截器,我就无法访问真正的查询,无法重复它。没那么容易吧?你应该早点分享这些细节;)