解决方案一:直接使用ResultSet来处理

从ResultSet中将查询结果读入collection,缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。

对上述方法的一种改进是当用户第一请求数据查询时,就执行SQL语句查询,获得的ResultSet对象及其要使用的连接对象都保存到其对应的会话对象中。以后的分页查询都通过第一次执行SQL获得的ResultSet对象定位取得指定页的记录(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。最后在用户不再进行分页查询时或会话关闭时,释放数据库连接和ResultSet对象等数据库访问资源。每次翻页都只从ResultSet中取出一页数据。这种方式在某些数据库(如Oracle)的JDBC实现中差不多也是回缓存所有记录而占用大量内存,同时速度也非常慢。

在用例分页查询的整个会话期间,一个用户的分页查询就要占用一个数据库连接对象和结果集的游标,这种方式对数据库的访问资源占用比较大,并且其利用率不是很高。

优点:减少了数据库连接对象的多次分配获取,减少了对数据库的SQL查询执行。

缺点:占用数据库访问资源-数据库连接对象,并占用了数据库上的资源-游标;会消耗大量内存;

解决方案二:定位行集SQL查询

使用数据库产品提供的对查询的结果集可定位行范围的SQL接口技术。在用户的分页面查询请求中,每次可取得查询请求的行范围的参数,然后使用这些参数生产取得指定行范围的的SQL查询语句,然后每次请求获得一个数据库连接对象并执行SQL查询,把查询的结果返回给用户,最后释放说有的数据库访问资源。

这种方式需要每次请求时都要执行数据库的SQL查询语句;对数据库的访问资源是使用完就立即释放,不白白占用数据库访问资源。 对特定(提供了对查询结果集可定位功能的)的数据库产品,如:Oracle(rowid或rownum ),DB2(rowid或rownum ()), PostgreSQL(LIMIT 和 OFFSET),mySQL(Limit)等。(MS SQL Server 没有提供此技术。)

下面是在oracle下的查询语句示例:

SELECT * FROM ( SELECT row_.*, rownum rownum_ FROM (...... ) row_ WHERE rownum <= {pageNumber*rowsPerPage}) WHERE rownum_ > {(pageNumber-1)*rowsPerPage}

优点:对数据库的访问资源(数据库连接对象,数据库游标等)没有浪费,这些资源的充分重复的利用。

缺点:对每次分页面查询请求要频繁的从Web容器中获得数据库访问资源(数据库连接对象和数据库游标)并建立连接;要依赖于具体的数据库产品的支持。

java分页查询海量数据_Java中的大量数据查询相关推荐

  1. java数据查询_Java中的大量数据查询

    问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询数据库,而查询结果是上千条甚至是上百万条记录,要求查询 问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询 ...

  2. java 游标 查数据_Java中的大量数据查询

    问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询数据库,而查询结果是上千条甚至是上百万条记录,要求查询结果传送到客户端浏览器并分页显示. 考虑因素: 1. Web服务器的资源消 ...

  3. mongodb java 查询 日期_Java中的日期MongoDB查询

    我正在尝试向 mongodb查询"date"在两个日期之间的文档. 示例数据是: { "_id" : ObjectId("4fad0af6709fbc ...

  4. java 生成pdf文件_Java 中HTTP响应数据生成PDF,PDF文件的读取

    将HTTP响应数据生成PDF,这一步的话,就比较坑,浪费了好多时间,查了很多资料,也是我想把它记录下来的主要原因, 废话少说,先说踩的坑 1.区分字符流.字节流 这里可以百度一下,但是简言之就是: j ...

  5. java 导出订单明细_java中的excel数据的导入和导出

    /*** 导出供应商的数据*/@Overridepublic voidexport(OutputStream os, Supplier t1) {//查出符合条件的所供应/客户的列表 List sup ...

  6. java分页插件PageHelper的内置list数据操作失败

    问题描述: java分页插件PageHelper的内置list数据在hanlder处理器中获取失败,但是测试确通过了,如下图 但是测试代码成功 @ContextConfiguration(locati ...

  7. 审计MySQL 8.0中的分类数据查询

    面临的挑战 通常,涉及到敏感信息时用户需要使用审计日志.不仅仅是在表上运行Select,还包括访问表中的特定单元格.通常,这类数据将包含一个分类级别作为行的一部分,定义如何处理.审计等策略. 诸如此类 ...

  8. PHP中mysql查询全部过程_PHP到MySQL数据查询过程概述_MySQL

    摘要 本文概述了从PHP层发起mysql查询请求到mysql server 返回结果集的工作流程,并简单描述了各层可能涉及到的动作和组件.从全局把握整个交互过程. PHP层到MySQL层 Php到sq ...

  9. /*1. 查询SC表中的全部数据。*/ SELECT * FROM SC /*2. 查询计算机系学生的姓名和年龄。*/ SELECT Sname,Sex FROM Student WHERE Sd

    1.  查询SC表中的全部数据. SELECT * FROM SC 2.  查询计算机系学生的姓名和年龄. SELECT Sname,Sex FROM Student WHERE Sdept='计算机 ...

最新文章

  1. Only fullscreen opaque activities can request orientation
  2. php redis search,php redis类
  3. mastered skills
  4. iis mysql php 附件上传大小_修改上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法...
  5. windows下安装及配置 golang 的Web框架Beego环境
  6. ORACLE LINUX 6.3 + ORACLE 11.2.0.3 RAC + VBOX安装文档
  7. 用命令关闭计算机,使用DOS命令关机的操作步骤
  8. SQL server常见问题
  9. WannaCry勒索病毒分析
  10. 本地项目上传至git码云步骤(超详细,附图文)
  11. 春晚红包花落拼多多 巨头们为何前赴后继抢春晚?
  12. 一款红队大量资产指纹探测工具
  13. canvas 之 炫彩小球
  14. 从pdf复制文字到word中的问题
  15. 基于任务点的加速仿真
  16. 无法建立与远程计算机连接,解决“不能建立到远程计算机的连接,因此用于此...”的方法_常见问题解析...
  17. 古老的MFC,你还会用吗?
  18. 网站搭建之Apache安装教程
  19. 【毕业设计】基于单片机的录音器设计与实现 - 物联网 嵌入式 stm32
  20. java分页插件valuelist

热门文章

  1. 下面不属于python保留字_下面不属于 Python 保留字的是【 】。_学小易找答案
  2. 【C】C语言三种方法判别指定字符串是否被另一字符串包含
  3. Linux命令详解(14)useradd命令
  4. DFS剪枝优化 小猫爬山 数独
  5. 【转载】运维角度浅谈MySQL数据库优化
  6. linux 12541无监听程序,ORA-12541:TNS:无监听程序问题 解决办法
  7. python语言读后感_Python自然语言处理读后感锦集
  8. php死循环代码怎么写,详解PHP死循环写法和作用
  9. 一篇文章学会 python turtle海龟绘图
  10. 案例:模拟实现选民投票过程:一群选民进行投票,每个选民只允许投一次票,并且当投票总数达到100时,就停止投票