从Hibernate \ Oracle获得不正确的结果

时间:2011-06-21 16:11:11

标签: java oracle hibernate oracle11g

Tomcat:5.5
甲骨文:11G(11.1.0.7.4)
JDK:1.6
Hibernate:3.0.5

背景
我们正在使用Hibernate在视图上获取rowcount。 视图的编写方式始终至少为一行。 在数据库中,有足够的行可供视图返回8行。

问题
偶尔,我们算作ZERO

如果我们再次尝试(即用户刷新屏幕),则返回正确的8次计数。

研究
我们尝试过很多东西来排除以下内容

1)Oracle服务器返回错误结果
2)检查视图以确保它是好的,即将返回正确的结果

现在怀疑正转向Hibernate

代码段
你能在下面的代码中发现任何可疑的东西吗?

public static int getRowCount( Criteria criteria )
{
    int totalRows = 0;
    criteria.setProjection( Projections.rowCount() );
    Integer count = ( Integer ) criteria.uniqueResult();

    if ( count != null )
        totalRows = count.intValue();

    criteria.setProjection( null );
    criteria.setResultTransformer( Criteria.ROOT_ENTITY );

    return totalRows;
}

我们还验证了计数为零且不为空 听起来很奇怪,已经发布了Oracle缺陷,它返回了错误的结果,而且当我们应用Oracle热修复时,这个错误就开始发生了。

问题
有人认为Oracle可能会返回不正确的结果吗? 任何关于如何排除故障的建议都将受到赞赏......

一些关键事实摘要
- 大约在我们将Oracle11G从11.1.0.6.1升级到11.1.0.7.4的同时开始发生并进行了一些热修复。
- 这是该时间框架内生态系统发生的唯一变化 - 对Oracle的更改 - 这种情况不一致。现在你看到了问题 - 现在你不要 - 不经常。但严重到足以引起警报。

4 个答案:

答案 0 :(得分:1)

我要做的第一件事是打开Hibernate的查询日志记录。这将告诉您究竟是什么SQL发送到Oracle。然后,您可以运行该确切的SQL并查看所获得的内容。

您可以使用以下方法之一启用查询日志记录:

  • 调整org.hibernate.SQL日志类别(more info
  • 设置Hibernate属性hibernate.show_sqlmore info

答案 1 :(得分:1)

v $ sql将显示SQL,执行了多少次以及处理的行数。

可能存在Oracle错误 - 通常在非常复杂的查询中,但对于给定的数据集通常也是一致的。

NO_DATA_FOUND异常可以从PL / SQL过程和函数引发,这些异常通常在客户端看来是一个空结果集。没有关于视图,表格和相关代码的更多细节......这都是猜测

答案 2 :(得分:0)

我非常怀疑Oracle无法正确计算。其他事情正在发生的好机会。这是一种可能性(我在mat视图中看到过)。如果有人正在进行完全刷新(对于mview,则为atomic_refresh => false),那就像做截断+插入一样。

如果在此刷新过程中您选择了计数,请猜测,计数将为0。

只是猜测这里会发生什么。作为DBA监视该视图并验证在您选择计数时未进行刷新。

答案 3 :(得分:-2)

我的两分钱: 您拥有高性能的Oracle DBMS。为什么要把它当作廉价租用的mule或MySql数据库来对待Hibernate呢?

学习Oracle PL / SQL和JDBC需要花费同样多的精力来学习Hibernate及其所有怪癖。性能差异令人惊叹...