分页查询
背景1:一客户通过IE请求Web服务器查询数据,而查询结果是上千条甚至是上万条记录,要求查询结果传送到IE客户端并分页显示。
问:对于这样的有大量数据的结果集,在Web服务器端如何有效的处理?
方案1:游标查询
直接使用ResultSet处理,ResultSet是直接在数据库上建立游标,然后通过ResultSet的行位置定位接口来获得指定行位置的记录。
当用户第一请求数据查询时,就执行SQL语句查询,获得的ResultSet对象及其要使用的连接对象都保存到其对应的会话对象中。以后的分页查询都通过第一次执行SQL获得的ResultSet对象定位取得指定行位置的记录。最后在用户不再进行分页查询时或会话关闭时,释放数据库连接和ResultSet对象等数据库访问资源。
优点:
减少了数据库连接对象的多次分配获取,减少了对数据库的SQL查询执行。
缺点:
占用数据库访问资源-数据库连接对象,并占用了数据库上的资源-游标。而这些资源都是十分宝贵的有限制的。
方案2:定位行集SQL查询主要是直接使用数据库产品的提供的对查询的结果集可定位行范围的SQL接口技术。
在用户的分页面查询请求中,每次可取得查询请求的行范围的参数,然后使用这些参数生产取得指定行范围的的SQL查询语句,然后每次请求获得一个数据库连接对象并执行SQL查询,把查询的结果返回给用户,最后释放说有的数据库访问资源。
缺点:需要数据库产品支持分页查询,需要多次执行数据库sql查询
例如:Oracle数据库使用关键字:rowid或rownum
DB2:rowid或rownum()
MySQL使用Limit
Hibernate的分页查询实现:
Queryq=session.createQuery("fromCatasc");
q.setFirstResult(20000);
q.setMaxResults(100);
Listl=q.list();
hibernate的分页查询首先会使用数据库产品的特定sql,如果数据库产品不支持分页查询,则采用ResultSet来实现分页查询。
方案3:缓存一次SQL查询的结果集
一次性查出所有的记录结果,放入内容中,分页时从内存中获取记录。
缺点:对于大量数据的结果集,会占用web容器的大量内存,影响性能,会导致查看到过期的数据;适用于少量数据,相比数据库查询速度要快。