解决方案一:直接使用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技巧:Java中的大量数据查询相关推荐

  1. clob在java里的类型_Java对Oracle中Clob类型数据的读取和写入(转)

    Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的也不是很清楚,我对网上资料进行了整理和总结,具体看代码: 写入 ...

  2. java全角数字_JAVA技巧(JAVA全角和半角的转换代码)

    实现代码如下: public class change { public static void main(String[] args) { String QJstr="全角转半角DAO&q ...

  3. Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面

    Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录

  4. laytpl遍历实体列表_Layui数据表格之获取表格中所有的数据方法

    数据表格中的数据是通过直接赋值的方式.这里实际上思想是反过来的,将拿数据表格中的所有数据,转换为layui数据表格拿原始数据去渲染数据表格. 1.创建一个作用域合适的js对象数组用来保存数据表格中的原 ...

  5. 什么是数据标准化?在Python中如何进行数据标准化?「必学」

    转载:https://www.toutiao.com/i6644145067256709645/?tt_from=weixin&utm_campaign=client_share&wx ...

  6. 获取layui表格单元格的数据_Layui数据表格之获取表格中所有的数据方法

    数据表格中的数据是通过直接赋值的方式.这里实际上思想是反过来的,将拿数据表格中的所有数据,转换为Layui数据表格拿原始数据去渲染数据表格. 1.创建一个作用域合适的JS对象数组用来保存数据表格中的原 ...

  7. java 找出list中相同数据_Java获取List中相同的数据

    我现在连废话都懒得说了,直接讲代码吧! int index = 0; for (int i = 0,len = list.size(); i < len; i++) { if(list.size ...

  8. java删除jtable一行的值_JTable中删除一行数据

    Jtable中删除一行数据: import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; i ...

  9. java怎么加定时器_JAVA WEB程序中添加定时器

    JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...

  10. 取java.sql.date日期_JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]...

    1.如何将java.util.Date转化为java.sql.Date? 转化: java.sql.Date sd; java.util.Date ud; //initialize the ud su ...

最新文章

  1. 为反对种族歧视,GitHub正在把master/slave等术语替换掉
  2. XP下如何恢复Administrator
  3. 这些密码千万不要用!黑客5分钟即可破解!
  4. 边缘计算、雾计算、云计算区别几何?
  5. 2019春第六周编程总结
  6. CSDN×易观算法大赛火热进行中~
  7. NUC1196 Sum【水题+数学题】
  8. Python print()重定向 不输出到屏幕
  9. Cannot detect Web Project version. Please specify version of Web Project through Maven project ...报错
  10. Matlab 获取主板、硬盘、CPU、BIOS和网卡序列号
  11. ”被裁员6次的运营总监分享”总被裁员的运营人到底是为什么?
  12. 计算机丢失drivers文件,system32\drivers.Sys文件丢失怎么解决?
  13. 微信公共号开发教程java版——基础知识和环境搭建(一)
  14. 如何显示 word 左侧目录大纲
  15. 软件开发工具的使用与开发
  16. Intel Distiller工具包-量化实现1
  17. TLS 协议-对称加密原理
  18. java数组中包含元素_Java中声明数组时,包括数组的名字、数组中包含的元素的 。 (5.0分)_学小易找答案...
  19. win7老计算机,解决旧电脑运行win7慢的小技巧
  20. 众安在线:提出保险通证化,力推10余个区块链应用产品 |追击上市公司

热门文章

  1. python 制作 gif 动态图
  2. 修改webbrower中浏览器版本
  3. 农历大小月的确定方法
  4. ACL的介绍以及分类
  5. ubuntu安装pr_[原创]Dapr入门教程之二:Dapr的安装
  6. 崩坏三8月20号服务器维修,崩坏38月20日版本更新维护通知
  7. Cisco IGRP
  8. [生存志] 第130节 司马著史记
  9. 三部门禁止对新能源车限购 专家:京沪情况复杂,政策仍不明朗
  10. java 解决oracle US7ASCII编码,sql查询时