锁定老帖子 主题:发疯Hibernate分页问题,性能优化!
精华帖 (2) :: 良好帖 (0) :: 新手帖 (18) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-19
不行就用lucence 吧~ 索引文件搞~ 查库啥时候都慢~
|
|
返回顶楼 | |
发表时间:2008-08-19
/** * 去除hql的select 子句 * @param hql * @return hql */ public static String removeSelect(String hql) { Assert.hasText(hql); int beginPos = hql.toLowerCase().indexOf("from"); Assert.isTrue(beginPos != -1, " hql : " + hql + " must has a keyword 'from'"); return hql.substring(beginPos); } /** * 去除hql的orderby 子句 * @param hql * @return hql */ public static String removeOrders(String hql) { Assert.hasText(hql); Pattern pattern = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*" , Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(hql); StringBuffer buf = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(buf, ""); } matcher.appendTail(buf); return buf.toString(); } 其中这个removeOrders 和 removeSelect 谁能告诉我一下有什么用处么? 谢谢 还有关于这种海量数据分页的问题,如果不是很在意总数的实事性,是否可以只在第一次查询的时候就算出count,后面的查询只查询内容而不用再次计算count呢? 即第一次查询: 1·查处满足sql条件的所有记录数目 ( count(*) ) 2·返回前100条数据 第二次查询(即表示层调用了翻页) 1·查询满足sql条件的第101~200条记录 ..... 第n次查询(查找到最后一页) 1·查询满足sql条件的第1000~1200条记录(假设count*的结果是1200) 请问是这样一个过程么 ? 谢谢 |
|
返回顶楼 | |
发表时间:2008-08-19
这样行不:
hql作为分页类的参数,方法签名: listByPage(String hql,Page page) int position = hql.toLowerCase().indexOf("from"); String totalHql = "select count(*) as totals " + hql.substring(position); 这个就可以算总数了,ORDER BY 其实不去掉也没事吧。 |
|
返回顶楼 | |
发表时间:2008-08-20
soci 写道 这样行不:
hql作为分页类的参数,方法签名: listByPage(String hql,Page page) int position = hql.toLowerCase().indexOf("from"); String totalHql = "select count(*) as totals " + hql.substring(position); 这个就可以算总数了,ORDER BY 其实不去掉也没事吧。 SpringSide就是这么做的,order by不去掉,可能会浪费无谓的排序计算吧。 |
|
返回顶楼 | |
发表时间:2008-08-20
这个方法不知道多个JOIN TABLE会不会有问题
我的感觉,分页这东西很鸡肋的,还不如像BLOG那样 搞个日历,通过日期访问记录更有意义。 |
|
返回顶楼 | |
发表时间:2008-08-20
能看一下我那个问题么? 谢谢了
|
|
返回顶楼 | |
发表时间:2008-08-20
iamzealotwang 写道 能看一下我那个问题么? 谢谢了
removeOrders 和 removeSelect 方法注释很明白了,前一个去掉ODER BY 后一个去掉 SELECT XXXX 只取中间的from xxx where xx 作为计算COUNT的条件 回到主贴 我还是认为如果海量数据要分页这个需求要灵活些 比如你是新闻网站,最好按日期列出新闻 如果是小说网站,比如给红楼梦分页,那就上一页下一页就可以或者按书的章节分。 如果是论文检索网站,你可以先按年度分页。 总之有很多办法把取总数这个问题绕过去。 |
|
返回顶楼 | |
发表时间:2008-08-20
soci 写道 这个方法不知道多个JOIN TABLE会不会有问题
我的感觉,分页这东西很鸡肋的,还不如像BLOG那样 搞个日历,通过日期访问记录更有意义。 join table不会有问题,这个方法我已经在两个项目中用了半年多了。 |
|
返回顶楼 | |
发表时间:2008-08-20
引用 removeOrders 和 removeSelect 方法注释很明白了,前一个去掉ODER BY 后一个去掉 SELECT XXXX 只取中间的from xxx where xx 作为计算COUNT的条件 明白了 谢谢了。 引用 关于这种海量数据分页的问题,如果不是很在意总数的实事性,是否可以只在第一次查询的时候就算出count,后面的查询只查询内容而不用再次计算count呢? 即第一次查询: 1·查处满足sql条件的所有记录数目 ( count(*) ) 2·返回前100条数据 第二次查询(即表示层调用了翻页) 1·查询满足sql条件的第101~200条记录 ..... 第n次查询(查找到最后一页) 1·查询满足sql条件的第1000~1200条记录(假设count*的结果是1200) 那关于这点,我想的对么? 麻烦您了。 |
|
返回顶楼 | |
发表时间:2008-08-20
总数保存可以的,很多人这么用。
|
|
返回顶楼 | |