2 定位行集SQL查询 主要是直接使用数据库产品的提供的对查询的结果集可定位行范围的SQL接口技术。
在用户的分页面查询请求中,每次可取得查询请求的行范围的参数,然后使用这些参数生产取得指定行范围的的SQL查询语句,然后每次请求获得一个数据库连接对象并执行SQL查询,把查询的结果返回给用户,最后释放说有的数据库访问资源。
说明:这种方式需要每次请求时都要执行数据库的SQL查询语句;对数据库的访问资源是使用完就立即释放,不白白占用数据库访问资源。 对特定(提供了对查询结果集可定位功能的)的数据库产品。
如:Oracle,DB2, PostgreSQL,mySQL等。(MS SQL Server 没有提供此技术。) 如:
1. Oracle数据库使用关键字:rowid或rownum
2. DB2:
rowid或rownum ()
3. PostgreSQL 使用LIMIT 和 OFFSET
4. MySQL 使用Limit 优点:
这种技术是直接使用数据库产品自己提供的可对查询结果集定位行范围过滤的功能,因此直接利用了数据库的性能对此分页查询的优化功能。
对数据库的访问资源(数据库连接对象,数据库游标等)没有浪费,这些资源的充分重复的利用。
对查询的结果对Web容器没有什么特别要求。
缺点:
要执行多次数据库SQL查询操作。对每次的分页面操作请求都要指定相应范围的结果集来执行SQL语句的数据库查询操作,这对数据库有一定的影响。
对每次分页面查询请求要频繁的从Web容器中获得数据库访问资源(数据库连接对象和数据库游标)。
要依赖于具体的数据库产品。因为对没有实现没有提供此技术的数据库产品不能使用此方式。
结论:
由于每次对数据库的SQL查询操作相对而言耗用的数据资源比较少,并且在实际用户的操作中,有可能用户对查询的所有结果集只是需要查看其中的部分页面。
因此这种方式是非常好的的。
3 特别处理的定位行集SQL查询。这种方式是在方式2的基础上针对不提供对查询结果集行范围定位的数据库产品。
其在Web容器端的操作逻辑大致和方式2相同。
只是先要对要查询的数据库表要有一字段的数据能区别每条不同的数据记录。第一次查询时,获得用来可唯一标识不同记录的字段的所有结果集,并缓存起来以备后面的分页面查询指定要查询的结果集的行范围。 主要是针对不同对查询行集可定位范围获得的数据库产品,如MS SQL Server等。 假设从A,B,C三个表中选取数据。且A有字段ID用来可唯一区别不同的记录。
那么第一次查询的时候,会查询两次1. select A.id from A,B,C where condition.
2. 把A的ID缓存到SESSION中?3.从Session中。现可按照次序来取得相应页面范围的ID来,并构造下一个查询语句:select A.name, B.add from A,B,C where condition && (
A.ID in 本页面范围的 ID )
以后每次翻页的时候,依次获得对应页的ID只要表中唯一的就可以了。无所谓大小,顺序?这样,SESSSION缓存的就只是一列而不是所有列了。当然,对于列数不多的,效果并不好。
也可使用存储过程实现,可参照:http://expert.csdn.net/Expert/topic
/2365/2365596.xml?temp=.7529261
优点:
同方式2
缺点:
同方式2;
还要在要查询的数据库表中建立一个相应的ID,用来唯一区别每条记录。
结论:
同方式2.
4 缓存一次SQL查询的结果集 优点:
缺点:
既然我们要缓存结果,那么用户就可能会看到过期的数据
说明:对于实际情况的应用来说,一般结合实际情况,结合使用方式2(或方式3)和方式4.如:一个应用场景:对公司的产品的查询是经常的,但是产品的种类不是很多,这时可使用缓存方式;但是对有些查询结果集较大,数据库和Web容器之间的网络访问由可能是远程的,这时候可考虑使方式2(或者方式3)。
测试用例代码实现说明
一:测试用例3-ServletQueryForConnPool 版本
1.结构图
2.代码实现结构
3.运行时序图
4.测试运行情况说明
4.1 数据库连接和数据库游标占用可能比较大
由于数据库的查询及其分页处理是直接使用JDBC的,并在分页中是使用RseultSet的查询结果集-游标形式实现的,并且每个客户对应一个会话,每个会话对应一个数据库连接和一个结果集(游标),数据库连接和游标是在会话终止时才释放的。因此在多个客户的请求过程中,可能对数据库的访问资源(数据库连接和用于数据操作的游标)占用比较大。
因此数据库访问及其数据库的处理可能是个瓶颈。
4.2 资源没有释放的问题
会话对应的数据库连接和游标可能在会话终止时没有释放。
为了更好的体现出使用Web容器数据库连接池的优点,应该合理的设置连接池中连接对象的“非活动超时时间”,建议次值和Servlet对象的会话超时时间长度一直。
5.此测试用例操作说明
5.1 部署的包的位置:
ServletQueryForConnPool.war
5.2 部署
1.通过Weblogic 的控制台工具部署此包
2.相关的参数请看ServletQueryForConnPool.war包中的配置文件web.xml中相应的servlet配置参数
5.3 测试URL
http://server/:port/WebAppName
即:
http://web/服务器名:端口/Servlet部署的应用程序名
二:测试用例4 ServletQueryForConnPool_cache 版本
1.结构图
和“一:测试用例3”相同
2.代码实现结构
3.运行时序
说明:使用第四种“缓存一次SQL查询的结果集”的分页面查询技术,即一次SQL查询,把从数据库查询出来的结果保存到会话中,以后的客户分页查询操作都从此缓存中取得。
4.测试运行情况说明
由于使用的是缓存结果集的方式,对Web容器服务器的内存要求比较高,可能在测试过程中,Web容器服务器因内存问题而影响整个系统的响应性能。
5.此测试用例操作说明
5.1 部署的包的位置:
ServletQueryForConnPool_cache.war