显示标记提供给定对象的分页功能。 Hibernates提供了每页仅获取所需记录的选项。在我的项目中,我们使用了这两个概念。
显示标记: 我需要根据过滤条件获取所有记录并将其存储在Session中。然后这个显示标签将关注所有分页和排序。所以Httpsession包含大量数据。
休眠: 它只从数据库中获取所请求的没有对象。需要为每个请求打开会话。
最佳做法是什么?或者我们是否可以实现这两方面的工作?请帮忙。
答案 0 :(得分:4)
如您所述,使用DisplayTag,您需要获取所有结果并将其放入会话中。所以你只做了一个(可能很昂贵的)查询,但是从内存的角度来看这不会很好地扩展(如果你需要获取大量的结果或者你增加了并发用户的数量)。
另一方面,使用Hibernate,您可以使用setFirstResult
和setMaxResult
来仅获取每页上实际显示的记录。这需要对每个页面执行查询,但会缩放无限数量的结果。
就个人而言,我更喜欢第二种方法,我发现内存效率更高 - 特别是因为大多数用户不浏览所有页面(所以为什么要加载所有结果) - 并使用Pagination in Hibernate and EJB3中描述的模式。
如果您决定坚持第一种方法,我会实施某种最大结果数量限制,以避免过于昂贵的查询。如果查询超出限制,请要求用户执行更严格的搜索,即添加条件(无论如何,谁将浏览数千个结果?)。
如果您需要所有结果,例如出于报告目的,那么在我看来,DisplayTag和statefull会话都不是正确的工具。
答案 1 :(得分:3)
您实际上不需要获取所有结果,您可以使用名为外部分页的Displaytag功能,在其中告诉Displaytag您正在处理Displaytag外的分页。
有关详细信息,请参阅Displaytag文档中的External Paging and Sorting。
此外,this stackoverflow question还有更多信息和示例代码。