繁体   English   中英

休眠中是否有办法检索快速的非阻塞行数?

[英]Is there a way within hibernate to retrieve fast non-blocking row counts?

由hibernate生成的以下查询将花费13+秒并锁定表:

SELECT COUNT(auditentit0_.audit_id) AS col_0_0_ FROM Audit auditentit0_ WHERE 1=1; 

不断增长的Microsoft SQL Server数据库表包含90+百万行。

对于Microsoft SQL Server,我发现了一种非常快速地获取相同信息的准确元数据方法。

但是,如果休眠方式可以获取此信息,则我不希望为Microsoft sql服务器和oracle(下一个数据库)编写自定义代码。

这是一个准确且几乎即时的Microsoft sql服务器元数据查询示例:

SELECT SUM (row_count) FROM sys.dm_db_partition_stats WHERE object_id=OBJECT_ID('huge_audit_table') AND (index_id=0 or index_id=1);

有没有办法让休眠对表行数发出类似的查询?


一个已发布的答案表明该视图可能有用。 我正在调查此帖子,看它是否可以解决问题:

https://vladmihalcea.com/map-jpa-entity-to-view-or-sql-query-with-hibernate/

在休眠状态下,应使用在提供的链接中使用的投影,以确保它可在多个dbms上使用:

protected Long countByCriteria(DetachedCriteria criteria) {
   Criteria crit = criteria.getExecutableCriteria(getSession());
   crit.setProjection(Projections.rowCount());
   return (Long)crit.uniqueResult();
}

您在mysql中使用什么引擎? 我从未在MySql或Oracle中遇到过行计数阻塞的问题。 也许以下链接会为您提供帮助: 在不导致MySQL锁定的情况下进行选择的任何方法?

此外,经过一番快速阅读后,我发现Sql Server确实确实在数量上受阻。

也许您可以使用存储过程或其他机制将问题传递给dbms。


编辑:

Hibernate中的投影用于选择要提取的列,用于对元素进行分组的列以及使用内置的聚合函数(求和,计数,平均,最大值,最小值,countDistinct)。

它可以帮助您保持应用程序数据库不可知。 请记住,hibernate支持大约30个数据库。

在您的情况下,您遇到了mssql的特定问题,因为计数会阻塞表的优先级。 估计后,使用系统视图确实非常快捷,但这不是标准的。

您可以将问题封装到依赖于视图或存储过程的dbms中。 或者,也许您可​​以尝试使用NOLOCK提示或在休眠状态下使用READ UNCOMMITED(在审计表计数中应该可以接受)。

为了解决这个特定问题,我们退后一步,更改了UI的功能。 通过UIX和UI开发人员之间的共同努力,我们同意未过滤的查询不会要求总数。 初始屏幕加载将仅显示充满数据的页面。 没有60,000个控件的第1页。 仅当用户输入特定条件时,总数才起作用。 这些查询应该很快。 现在,用户仍然可以设置与原始问题一样糟糕的查询。 相对于规范应该是例外。

因此,对于OP确实没有可靠的答案。 如果您遇到此类问题,并且可以控制UI和API,那么现在该重新考虑解决方案了。 从UI角度考虑google如何处理分页。 恕我直言,显示“第(XX)页1”的日子已经过去。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM