2011-06-21 32 views
2

的Tomcat:5.5
甲骨文:11G(11.1.0.7.4)
JDK 1.6
休眠:3.0.5得到不正确的结果从休眠 ORACLE

上下文
我们正在使用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有可能返回不正确的结果?
如何解决这个任何建议将和赞赏...

总结一些关键事实
的 - 开始发生,当我们升级的Oracle11g从11.1.0.6.1到11.1。同时。 0.7.4,并做了一些热修复。
- 这是在此期间生态系统发生的唯一变化 - 对Oracle
的更改 - 发生这种情况的方式不一致。现在你看到了问题 - 现在你不知道。
- 偶尔发生。但严重到足以导致警报。

+1

启用hibernate.show_sql来验证hibernate是否发送正确的SQL查询 – iliaden

回答

1

我会做的第一件事是打开Hibernate的查询日志记录。这将告诉你到底是什么SQL被发送到Oracle。然后,您可以运行该确切的SQL并查看获得的结果。

您可以通过以下方法之一打开查询日志记录:

  • 调整org.hibernate作为。SQL日志类别(more info
  • 设置休眠特性hibernate.show_sqlmore info
+0

只需将属性'hibernate.show_sql'设置为'true'即可。 – Marcelo

+0

你说得对。我有一个测试正在运行,日志打开到第十亿度 - 我使用的是log4jdbc.googlecode.com。与此同时,我想知道是否还有其他方法可以进行调试(它有时需要几天时间才能打开我们的QA环境)。谢谢! –

+1

@RN如果您有dba访问数据库的权限,您可以看到应用程序正在执行的监视数据库当前会话的sqls。 – Marcelo

0

我高度怀疑,甲骨文不能得到算对。很可能会发生其他事情。这是一种可能性(我已经在垫子上看过)。如果有人正在做一个完整的刷新(对于mview,atomic_refresh => false),那么它就像做一个截断+插入。

如果刷新过程中你选择的数量,你猜怎么着,计数会= 0

只是一个什么可以发生在这里的猜测。由于数据库管理员需要监视该视图,并在选择计数时验证刷新没有发生。

+0

这不是一个席子视图 - 而是一个普通的旧香草视图。 –

1

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

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

可能会从PL/SQL过程和函数引发NO_DATA_FOUND异常,这通常会在客户端显示为空结果集。没有关于视图,表格和相关代码的更多细节......这全是猜测

+0

我也可以得到Resultset吗? –

-2

我的两分钱: 您拥有高性能的Oracle DBMS。为什么把它当作一个便宜的租用骡子或一个MySql数据库来处理呢?

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

+0

有时真相会伤害.... –