Tomcat: 5.5
甲骨文: 11G(11.1.0.7.4)
JDK: 1.6
冬眠: 3.0.5
上下文
我们使用Hibernate获取视图上的行计数。视图的编写方式总是至少得到一行。在数据库中,有足够的行供视图返回8行。
问题
偶尔,我们会被算作零
如果我们再试一次(即用户刷新屏幕),将返回正确的计数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可能返回了不正确的结果?
关于如何排除这一问题的任何建议也将不胜感激.
几个关键事实综述
发布于 2011-06-21 16:14:13
我要做的第一件事是打开Hibernate的查询日志。这将确切地告诉您要向Oracle发送什么SQL。然后,您可以运行精确的SQL,并查看您得到了什么。
可以使用下列方法之一打开查询日志记录:
hibernate.show_sql (更多信息)发布于 2011-06-21 22:59:14
v$sql将显示SQL、已执行的次数和处理的行数。
有可能出现Oracle错误--通常是在非常复杂的查询中,但对于给定的数据集也通常是一致的。
NO_DATA_FOUND异常可以从PL/SQL过程和函数引发,客户端通常认为它们是一个空的结果集。如果没有更多关于视图的详细信息,表和相关的code....it都是猜测。
发布于 2011-06-21 17:13:51
我非常怀疑甲骨文无法正确计算。很有可能发生了其他事情。这是一种可能性(我在垫子上见过)。如果有人正在进行完全刷新(atomic_refresh=>false表示mview),那么就像执行截断+插入一样。
如果在刷新期间选择计数,猜怎么着,计数将= 0。
猜一下这里可能会发生什么。作为DBA来监视该视图,并验证在选择计数时没有发生刷新。
https://stackoverflow.com/questions/6428544
复制相似问题