论坛首页 Java企业应用论坛

发疯Hibernate分页问题,性能优化!

浏览 39929 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (18) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-19  
不行就用lucence 吧~ 索引文件搞~ 查库啥时候都慢~
0 请登录后投票
   发表时间: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)

请问是这样一个过程么 ? 谢谢
0 请登录后投票
   发表时间: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 其实不去掉也没事吧。
0 请登录后投票
   发表时间: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不去掉,可能会浪费无谓的排序计算吧。
0 请登录后投票
   发表时间:2008-08-20  
这个方法不知道多个JOIN TABLE会不会有问题
我的感觉,分页这东西很鸡肋的,还不如像BLOG那样 搞个日历,通过日期访问记录更有意义。
0 请登录后投票
   发表时间:2008-08-20  
能看一下我那个问题么? 谢谢了

0 请登录后投票
   发表时间:2008-08-20  
iamzealotwang 写道
能看一下我那个问题么? 谢谢了


removeOrders 和 removeSelect 方法注释很明白了,前一个去掉ODER BY 后一个去掉 SELECT XXXX
只取中间的from xxx where xx 作为计算COUNT的条件

回到主贴 我还是认为如果海量数据要分页这个需求要灵活些
比如你是新闻网站,最好按日期列出新闻
如果是小说网站,比如给红楼梦分页,那就上一页下一页就可以或者按书的章节分。
如果是论文检索网站,你可以先按年度分页。
总之有很多办法把取总数这个问题绕过去。
0 请登录后投票
   发表时间:2008-08-20  
soci 写道
这个方法不知道多个JOIN TABLE会不会有问题
我的感觉,分页这东西很鸡肋的,还不如像BLOG那样 搞个日历,通过日期访问记录更有意义。


join table不会有问题,这个方法我已经在两个项目中用了半年多了。
0 请登录后投票
   发表时间: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)


那关于这点,我想的对么? 麻烦您了。
0 请登录后投票
   发表时间:2008-08-20  
总数保存可以的,很多人这么用。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics