首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Hibernate获得不正确的结果\Oracle

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

Stack Overflow用户
提问于 2011-06-21 16:11:11
回答 4查看 2.2K关注 0票数 2

Tomcat: 5.5

甲骨文: 11G(11.1.0.7.4)

JDK: 1.6

冬眠: 3.0.5

上下文

我们使用Hibernate获取视图上的行计数。视图的编写方式总是至少得到一行。在数据库中,有足够的行供视图返回8行。

问题

偶尔,我们会被算作零

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

调查

我们已经尝试了很多方法来排除以下情况

1) Oracle服务器返回错误的结果

2)检查视图以确保它是好的,即返回正确的结果

现在怀疑转向了Hibernate

代码片段

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

代码语言:javascript
复制
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的更改。
  • 这种情况的发生并不一致。现在你看到问题了-现在你不知道了。
  • 不经常。但严重到足以引起警报。
EN

回答 4

Stack Overflow用户

发布于 2011-06-21 16:14:13

我要做的第一件事是打开Hibernate的查询日志。这将确切地告诉您要向Oracle发送什么SQL。然后,您可以运行精确的SQL,并查看您得到了什么。

可以使用下列方法之一打开查询日志记录:

  • 调整org.hibernate.SQL日志类别(更多信息)
  • 设置Hibernate属性hibernate.show_sql (更多信息)
票数 1
EN

Stack Overflow用户

发布于 2011-06-21 22:59:14

v$sql将显示SQL、已执行的次数和处理的行数。

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

NO_DATA_FOUND异常可以从PL/SQL过程和函数引发,客户端通常认为它们是一个空的结果集。如果没有更多关于视图的详细信息,表和相关的code....it都是猜测。

票数 1
EN

Stack Overflow用户

发布于 2011-06-21 17:13:51

我非常怀疑甲骨文无法正确计算。很有可能发生了其他事情。这是一种可能性(我在垫子上见过)。如果有人正在进行完全刷新(atomic_refresh=>false表示mview),那么就像执行截断+插入一样。

如果在刷新期间选择计数,猜怎么着,计数将= 0。

猜一下这里可能会发生什么。作为DBA来监视该视图,并验证在选择计数时没有发生刷新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6428544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档