MyException - 我的异常网
当前位置:我的异常网» Java Web开发 » *怎么实现分页加速查询*

*怎么实现分页加速查询*

www.MyException.Cn  网友分享于:2013-01-30  浏览:44次
************如何实现分页加速查询*************
现在分页已经有了。但是如果查询的数据量超过10万的话,那么速度就很慢了。
有没有高手可以给点提示,如何解决一下,比如一次查询就差出来一页的数据量,10条,那么翻页就查出来下一个10条,这样速度就提上去了。不知道如何实现,在那里突破;

现在的每次翻页都是把数据库里面的全部查询一次,只是显示选择的页而已。


------解决方案--------------------
你怎么分页的?
------解决方案--------------------
数据库里面可以限制你查的记录从多少条到多少条的啊!
------解决方案--------------------
用Hibernate里的分页查询
------解决方案--------------------
mysql limit 
sql2000 top
oracle rownum
------解决方案--------------------
http://zhidao.baidu.com/question/70930846.html 百度知道
------解决方案--------------------
select top页面 ×显示数 where id not in (select top (页面-1) ×显示数)
------解决方案--------------------
mark
------解决方案--------------------
第n页. 每页显示x条
mysql: SELECT * FROM USER limit (n - 1) * x, x
sql2000: SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER);
oracle: SELECT * FROM (
SELECT users.*, ROWNUM RN FROM (SELECT * FROM USER) users 
WHERE ROWNUM < (n * x)
)
WHERE RN >= (n - 1) * x


USER
id | username | password
------------------------
| |
| |
| |

------解决方案--------------------
hibernate: getSession().createQuery("FROM User").setFirstResult(开始记录数).setMaxResults(每页显示多少条);
------解决方案--------------------

肯定是后台动手脚了
每次查询只取出当前页面的数据量
看你用什么了
9楼10楼不错
------解决方案--------------------
LZ的是假分页。
------解决方案--------------------
每次翻页的时候,就去查询一下数据库,给一个查询的范围,比如从21——30条,这个应该很好实现啊~~
楼主不会是直接把所有的数据全部都load出来了吧~~
------解决方案--------------------
分页一般有两种 一种就是楼主这样的
适合于数据量小 并且适合换数据库
第二种就是每次只查询每页显示的条数
第二种方法实现的方式有很多 我最喜欢用的就是
搞一个自定义分页标签 这样每次查询的时候只要直接拿过来
修改表名等信息 就可以了
但是自定义标签好像不可以和ajax做集成(数据展示用到ajax)
至于具体的自定义标签网上一大把
------解决方案--------------------
在数据库中分页感觉是最快的!
------解决方案--------------------
Hibernate里的分页查询
------解决方案--------------------
我处理过最多的数据时45万条,SqlServer2005 不能使用top 使用top超慢,还不如使用结果集分,
9楼和10楼 是目前最好的解决办法了
------解决方案--------------------
使用预抓取
------解决方案--------------------
Java code

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

/**
 * Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过.
 * 
 */
public class Pager {
    /** Used database connection */
    Connection conn = null;
    public Pager() {
    }
    /**
     * 
     * 分页功能, 返回当页的数据(JDBC 2.0 实现).
     * @param currentPage
     * 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1)
     * @param pageCount
     * 每页显示记录
     * @return a Vector - 数据列表
     */
    public Vector pageData(int currentPage, int pageCount) {
        
        Vector results = new Vector();
        String tableName = "table_name";// 要处理的表格名
        ResultSet rs = null;
        String sql = "SELECT * FROM " + tableName;
        Statement stmt = null;
        try {
            // 生成可滚动的结果集表达式
            stmt = conn.createStatement(ResultSet.
            TYPE_SCROLL_SENSITIVE,
            ResultSet.CONCUR_READ_ONLY);
            rs = stmt.executeQuery(sql);
            int count = recordCount(); // 总记录数
            int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 总页面数
            if (currentPage <= 0) {
                currentPage = 1;
            }
            // 超出页码范围, 不返回数据
            if (currentPage > totalPage) {
                currentPage = totalPage;
                return results;
            }
            if ((currentPage - 1) * pageCount > 0) {
                // 移动结果集数据到当前页
                rs.absolute((currentPage - 1) * pageCount);
            }
            // rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor
            // position (0) is invalid
            int i = 0; // Readed pages
            while (rs.next() && i < pageCount) {
                i++;
            }
        } catch (Exception exception) {
            System.out.println("Occur a error in " + getClass()
            + ".pageData() : " + exception.getMessage());
        } finally {
            closeJDBCResource(stmt);
            closeJDBCResource(rs);
            closeJDBCResource(conn);
        }
        return results;

    }

    /**
     * 
     * 返回当前数据库中记录的总数.
     * @return int 记录总数
     */
    public int recordCount() {
        int allCount = -1;
        String tableName = "table_name";// 要处理的表格名
        String sql = "SELECT COUNT(*) FROM " + tableName;
        ResultSet rs = null;
        Statement stmt = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                allCount = rs.getInt(1);
            }
        } catch (Exception exception) {
            System.out
            .println("Occur a error in " + getClass()
            + ".recordCount() : " + exception.getMessage());
        } finally {
            closeJDBCResource(stmt);
            closeJDBCResource(rs);
            closeJDBCResource(conn);
        }
        return allCount;

    }

    /**
     * Close a jdbc resource, such as ResultSet, Statement, Connection.... All
     * these objects must have a method signature is void close().
     * @param resource -
     * jdbc resouce to close
     * 
     */
    public static void closeJDBCResource(Object resource) {
        try {
            Class clazz = resource.getClass();
            java.lang.reflect.Method method = clazz.getMethod("close", null);
            method.invoke(resource, null);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    /**
     * 
     * Test page.
     * @param args
     * 
     */
    public static void main(String[] args) {

        // 分页, 读取第一页数据, 共读取5个记录
        Vector data = new Pager().pageData(1, 5);
        // TODO: process value object, 更改类名
        /*
         * for(int i = 0; results != null && i < data.size(); i++) {
         * 
         * ValueObject bean = (ValueObject)data.get(i);
         *  }
         */
    }

}

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有