risc-v中文社区

 找回密码
 立即注册
查看: 756|回复: 1

ResultSet.TYPE_SCROLL_INSENSITIVE

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-5-19 10:19:00 | 显示全部楼层 |阅读模式
很多时候,我们使用数据库的查询结果集的代码如下:
PreparedStatement preparedStatement = dataSourceConnection.prepareStatement(sqlsb.toString());
ResultSet statementresultSet = preparedStatement.executeQuery();
然后我们通过while(statementrresultSet.next()){...}进行处理。但这种循环处理完成之后,不能再次使用statementresultSet了,相当于是一次性的,
为了能再次使用statementresultSet,比如再次跳到第3条记录,必须在prepareStatement中使用ResultSet.TYPE_SCROLL_INSENSITIVE等参数。
总结:
ResultSet.TYPE_SCROLL_INSENSITIVE

返回的结果集对数据库中的的数据变动是不敏感的。可以这么认为,当拿到结果集时,已经把数据库库中满足条件的所有记录都取了出来,放在缓存中,如果此时有另一个线程将数据库中的数据更改了,也不会影响这个结果集中的数据,因为它用的是缓存中的。

ResultSet.TYPE_SCROLL_SENSITIVE

与此对应,它返回的结果集是敏感的,那么是不是意味着拿到结果集后,数据库中的数据变化都会反映到结果集中呢?不是这样的,这里此时拿到的结果集只是某种条件的记录的id,当打印结果集中数据的时候,根据id再临时到数据库中取,那么对于拿到结果集后,数据库中的数据被更新了(update),肯定是会被反映到结果集上的,但是对于插入(insert)操作,由于新插入的记录的id并没有被结果集缓存,所以不会反映到结果集中,对于删除操作(delete),因为数据库中的删除操作只是对被删除的记录做一个标记,使之不被被检索到,实际的数据并没有被删除,而实际缓存的  是id的实际偏移,所以删除操作也不会被反映到结果集上。

如果用了ResultSet.TYPE_SCROLL_xxx,跳到最开始:statementresultSet.first();跳到最后:statementresultSet.last();





回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-5-19 13:36:54 | 显示全部楼层
实验测试:
                statementresultSet.first();
                System.out.println(statementresultSet.getDouble(2));
                statementresultSet.next();
                System.out.println(statementresultSet.getDouble(2));
                statementresultSet.last();
                System.out.println(statementresultSet.getDouble(2));
                statementresultSet.first();
                System.out.println(statementresultSet.getDouble(2));
通过查看数据库中的数据与打印显示出来的数据值,确实可知是上可反复查看的ResultSet而不是只能使用一次的ResultSet。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-4 19:20 , Processed in 0.020052 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表