我在Web应用程序中实现表查看的服务器端分页。这意味着用户具有激活第一页,最后一页,下一页和前一页的按钮。每次单击都会产生一个服务器请求,其中只返回要显示的记录。
要实现“最后一页”功能和滚动条,我需要客户端具有表的大小。我可以使用以下方法在服务器端获取此信息:
public long getCount(Class entityClass) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> query = builder.createQuery(Long.class);
Root root = query.from(entityClass);
Expression<Long> count = builder.count(root);
query.select(count);
TypedQuery<Long> typedQuery = em.createQuery(query);
return typedQuery.getSingleResult();
}
此表可能非常活跃,有数百万条记录。运行此函数是否会导致SQL服务器中的大量CPU周期被使用?
关注的是这个应用程序的扩展程度。
答案 0 :(得分:1)
这完全取决于数据库,我所知道的所有JPA实现都会将计数转换为select count(*) from Table
。我们有一个带有130GB数据的单表的Postgresql,大多数行只有几千字节。做select (*) from table
需要几分钟;开发人员曾经做过一个简单的未索引的选择查询,全表扫描大约需要45分钟。
在进行分页时,通常会有一个过滤器,将相同的文件管理器应用于数据查询和计数查询非常重要(使用CriteriaBuilder的主要原因之一是共享过滤部分查询)。今天我建议使用Spring-data
,因为它几乎毫不费力地进行分页。
如果你有很多数据,你可以像谷歌一样,说'zip'有1.340.000.000的结果,但只允许你提前10页,如果你运行到最后你会看到他们实际上只加载了1000页。换句话说,它们会缓存估计大小,但要求您缩小搜索范围以获得更精确的结果。