- 作者:zhaozj
- 发表时间:2020-12-23 10:36
- 来源:未知
关于JAVA的分页查询操作技术
网上看到的一篇文章,结合自己的经验和大家交流一下
对大量数据的分页处理问题描述:背景1:一客户通过IE请求Web服务器查询数据,而查询结果是上千条甚至是上万条记录,要求查询结果传送到IE客户端并分页显示。背景2:一客户通过IE或者其他方式请求Web服务器查询数据,而查询结果是上千条甚至是上万条记录,并要求查询结果把包传送到客户的E-mail中。问:对于这样的有大量数据的结果集,在Web服务器端如何有效的处理?可能涉及到的问题:1. 内存占用大量数据的结果集,可能要占用非常大的内存2. 传输速度及策略具体的分页处理技术
处理方法1 游标查询 直接使用ResultSet来处理。ResultSet是直接在数据库上建立游标,然后通过ResultSet的行位置定位接口来获得指定行位置的记录。当用户第一请求数据查询时,就执行SQL语句查询,获得的ResultSet对象及其要使用的连接对象都保存到其对应的会话对象中。以后的分页查询都通过第一次执行SQL获得的ResultSet对象定位取得指定行位置的记录。最后在用户不再进行分页查询时或会话关闭时,释放数据库连接和ResultSet对象等数据库访问资源。说明:在用例分页查询的整个会话期间,一个用户的分页查询就要占用一个数据库连接对象和结果集的游标,这种方式对数据库的访问资源占用比较大,并且其利用率不是很高。 所有的数据库产品。 优点:减少了数据库连接对象的多次分配获取,减少了对数据库的SQL查询执行。缺点:占用数据库访问资源-数据库连接对象,并占用了数据库上的资源-游标。而这些资源都是十分宝贵的有限制的。结论:这种的数据库查询分页处理方式不是最佳的。一般不适用这种方式。
2 定位行集SQL查询 主要是直接使用数据库产品的提供的对查询的结果集可定位行范围的SQL接口技术。在用户的分页面查询请求中,每次可取得查询请求的行范围的参数,然后使用这些参数生产取得指定行范围的的SQL查询语句,然后每次请求获得一个数据库连接对象并执行SQL查询,把查询的结果返回给用户,最后释放说有的数据库访问资源。说明:这种方式需要每次请求时都要执行数据库的SQL查询语句;对数据库的访问资源是使用完就立即释放,不白白占用数据库访问资源。 对特定(提供了对查询结果集可定位功能的)的数据库产品。如:Oracle,DB2, PostgreSQL,mySQL等。(MS SQL Server 没有提供此技术。) 如:1. Oracle数据库使用关键字:rowid或rownum 2. DB2:rowid或rownum ()3. PostgreSQL 使用LIMIT 和 OFFSET4. MySQL 使用Limit 优点:这种技术是直接使用数据库产品自己提供的可对查询结果集定位行范围过滤的功能,因此直接利用了数据库的性能对此分页查询的优化功能。对数据库的访问资源(数据库连接对象,数据库游标等)没有浪费,这些资源的充分重复的利用。对查询的结果对Web容器没有什么特别要求。缺点:要执行多次数据库SQL查询操作。对每次的分页面操作请求都要指定相应范围的结果集来执行SQL语句的数据库查询操作,这对数据库有一定的影响。对每次分页面查询请求要频繁的从Web容器中获得数据库访问资源(数据库连接对象和数据库游标)。要依赖于具体的数据库产品。因为对没有实现没有提供此技术的数据库产品不能使用此方式。结论:由于每次对数据库的SQL查询操作相对而言耗用的数据资源比较少,并且在实际用户的操作中,有可能用户对查询的所有结果集只是需要查看其中的部分页面。因此这种方式是最佳的。