休眠重复查询

Posted

技术标签:

【中文标题】休眠重复查询【英文标题】:hibernate repeat query 【发布时间】:2011-11-09 08:44:54 【问题描述】:

我有一个从 Oracle 11 DB 填充数据的 Web 应用程序(作为 ORM,我使用 Hibernate)。 在短时间内,一些 Oracle 包变得无效,然后又变得有效(这是遗留数据加载,在此过程中用户可以使用其他 UI)。

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

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

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

【问题讨论】:

【参考方案1】:

是 - 尝试/捕获异常,检查异常消息,查找 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 对象包装到您自己的实现中,这些实现只是委托给底层对象,但在 executeQuery() 的情况下,执行重试。

【讨论】:

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

以上是关于休眠重复查询的主要内容,如果未能解决你的问题,请参考以下文章

休眠圈出的实体[重复]

jpa(休眠)中具有重复行的结果集

休眠:org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话 [重复]

如何取消代理休眠对象[重复]

具有 OneToMany 关系的休眠重复条目

休眠:OutOfMemoryError:PermGen 空间 [重复]