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的更改
- 这种情况不一致。现在你看到了问题 - 现在你不要
- 不经常。但严重到足以引起警报。
答案 0 :(得分:1)
我要做的第一件事是打开Hibernate的查询日志记录。这将告诉您究竟是什么SQL发送到Oracle。然后,您可以运行该确切的SQL并查看所获得的内容。
您可以使用以下方法之一启用查询日志记录:
答案 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及其所有怪癖。性能差异令人惊叹...