这是一个理论问题,所以我不在这里发布任何代码。
问题是..我正在使用显示标签从至少有2000万行的多个表中获取报告的结果。查询需要自己的甜蜜时间来执行,并且显示标签可以很好地呈现表格。可能有一千个结果,但我每页只显示10个。每次进入下一页时,它都会转到我的dao类并再次获取相同的结果集,即使结果已经在下一页的会话中。现在在这种情况下,我的问题有两个。
a)有没有什么方法可以让它调查第二个三分之一或任何连续页面的会话?
b)即使第二页从第二页获得结果,第一次执行查询也需要时间。有没有办法减少这个时间?
我已经提到了以下问题,以便有个主意。我正在寻找更多的想法。
http://stackoverflow.com/questions/4770807/displaytag-alternatives
我喜欢这个
http://stackoverflow.com/questions/3143408/displaytag-pagination-vs-hibernate-pagination/3144744#3144744
答案 0 :(得分:0)
displaytag中没有任何内容表示“返回DAO课程”。所有这一切都重新请求页面,其中包含一些特殊的查询参数,告诉它向您展示哪些结果片段。请求页面时会发生什么完全取决于您。
您只需在请求处理程序中查看结果是否存储在会话中。如果是,则在响应中使用这些结果。如果不是,则运行查询并将其存储在会话中,然后再返回响应。
当然,如果允许用户指定参数,您需要知道用于生成存储在会话中的结果的参数,以便您知道是否需要重新运行查询。
然后问题是你是否真的想(或可以)在内存中存储2000多万行。
答案 1 :(得分:0)
你可以使用显示标签给出的一些参数进行检查。 这是我用来检查........
的方式Map stockParamMap = WebUtils.getParametersStartingWith(httpServletRequest, "d-");
if (stockParamMap.size() == 0) {
//dao call goes here
WebUtils.setSessionAttribute(httpServletRequest, "display_tbl",
list); // set list in session
}
如果您的网址中没有参数包含“d-”,则它将调用dao。否则,它仅在会话中填充列表。在进行分页时,它将包含此参数,因此它不会再次调用dao。 希望它能帮到你