休眠重复查询
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()
的情况下,执行重试。
【讨论】:
问题是......我不能在整个应用程序中做到这一点!如果我使用拦截器,我无法访问真正的查询,重复它。没那么容易吧? 你应该早点分享这些细节 ;)以上是关于休眠重复查询的主要内容,如果未能解决你的问题,请参考以下文章
休眠:org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话 [重复]