cursor类型

ResultSet.TYPE_FORWARD_ONLY

默认的cursor类型,仅仅支持向前forward,不支持backforward,random,last,first操作,类似单向链表。
   TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型

ResultSet.TYPE_SCROLL_INSENSITIVE

支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是不敏感,不可见的。

ResultSet.TYPE_SCROLL_SENSITIVE

支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是敏感,可见的。

分析

众所周知,JDBC对数据库进行数据查询时,数据库会创建查询结果的cache和cursor。而数据库的cursor是不支持backforward,random,last,first操作,仅仅只支持向前forward。那么TYPE_SCROLL_INSENSITIVE是如何实现支持backforward,random,last,first的呢?很简单,TYPE_SCROLL_INSENSITIVE的Statement查询把所有fetch的记录都缓存到JVM的Resultset对象内,如果有10个记录,直接跳到最后记录,TYPE_SCROLL_INSENSITIVE方式下把fetch所有记录到jvm端,并缓存下来,再进行random就是在数据库数组里面进行的。这也是TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型原因,如果要做一些复杂的功能,必然是要牺牲一些效率的。

那么为什么TYPE_SCROLL_INSENSITIVE对选择数据做出的更改是不敏感,不可见的呢?前面提到,JDBC对数据库进行数据查询时,数据库会创建查询结果的cache和cursor,如下面sql:
    select name,id from foo
    用jdbc执行上面的sql语句时,数据库会把foo表所有记录的name和id字段缓存到cache中,之后cache和真正的数据库数据文件没有任何联系了,foo表发生的改变在查询完成后不会自动同步到cache上去,因此TYPE_SCROLL_INSENSITIVE对选择数据做出的更改是不敏感,不可见。
    那么TYPE_SCROLL_SENSITIVE是怎么做到其它数据session对选择数据做出的更改是敏感,可见的。上面的sql语句用TYPE_SCROLL_SENSITIVE的Statement来执行,会转化成以下的sql语句:
    select rowid from foo
    数据库这时候是把foo表所有记录的rowid缓存到cache中,用户代码在fetch记录时,再继续做以下查询:
    select name,id from foo where rowid=?
    因此这时候发生的查询是实时从真正的数据库数据文件中取,因此对期间发生的数据更改是可见的,敏感的。但是这种可见性仅限于update操作,而insert和delete同样是不可见的。因为如果查询发生在insert之前,insert生成的rowid并不会反应在cache中的rowid结果集上。在一个记录的rowid已经缓存到cache中,这时候被删除了,但一般数据库的删除是标记删除,也就是说rowid对应那行记录并没有真正从数据库文件中抹去,一般是可以再次取到记录的。

总结

TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型,也是最常用的选择。
    TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的记录实体,在大量记录集返回时慎用。
    TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的记录rowid,需要进行二次查询,效率最低,开销最大

ResultSet参数类型说明相关推荐

  1. 通过mybatis自定义参数类型转换器,进行数据库字段加密脱敏

    1 问题背景 在数据库存储人员的信息时,有一些信息是敏感数据,如身份证号.出生地等.为了防止信息泄漏,这些信息不允许直接在数据库中查看,此时就需要对这些字段进行加密存储,但在页面查看的仍旧是解密后的数 ...

  2. resultset java 类型_关于JAVA中Resultset的类型

    JAVA中Resultset是一个类 而不是一个方法.记住啊. 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同 ...

  3. Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  4. python参数类型限定_python限定方法参数类型、返回值类型、变量类型等|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/python.html typing模块的作用 自python3.5开始,PEP484为python引入了类型注解(type hints ...

  5. 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.11节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  6. 秒懂JVM的三大参数类型,就靠这十个小实验了

    来源 | 悟空聊架构(ID:PassJava666) 本实验的目的是讲解 JVM 的三大参数类型.在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本 ...

  7. c语言函数参数类型检查,内联函数在编译时是否做参数类型检查?

    先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处 ...

  8. 判断exception类型_C++核心准则T.44:使用函数模板推断类模板参数类型(如果可能)...

    T.44: Use function templates to deduce class template argument types (where feasible) T.44:使用函数模板推断类 ...

  9. 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)...

    1.我们都知道在struts2中为防止浏览器绕过struts过滤器直接请求页面,所以我们都会配置一个拦截所有页面的action,如下: <action name="*"> ...

最新文章

  1. 神秘的中国超算:比肩高铁的世界级领先
  2. 使用redisson时关于订阅数的问题
  3. Windwos Server 2016 远程桌面授权
  4. 使用 Webix 创建 Email 客户端
  5. @ConfigurationProperties 注解
  6. C# 之 Math取整
  7. 在webstorm中配置sass的自动编译,并且可以指定编译后的css的目录.
  8. Redis-数据结构02-简单动态字符串(sds)
  9. 如何使VNC和Linux tty7 显示同步效果
  10. mysql界面导出数据库有乱码_导出的MYSQL数据库是乱码还可以变回中文吗
  11. 探究本质,WebGIS前端地图显示之地图比例尺换算原理
  12. 安卓手机管理器_手机QQ聊天记录如何导出到电脑上查看并打印
  13. mybatis获取map中的key和value
  14. Hadoop培训视频教程
  15. 流程图中省略的图表怎么表示_如何将流程图和图表添加到Google文档或幻灯片
  16. html设置图片与边框的距离,css图片如何设置上边框距离
  17. 为什么重大疾病保险最好要选择保障终身?
  18. unity3d 中控制手机前后摄像头切换
  19. Ubuntu安装迅雷,让下载变得轻松
  20. Google Chrome即将开始警告—停止支持Flash Player

热门文章

  1. 用博客记录自己的学习历程(莫等闲,白了少年头,空悲切)
  2. 首届API安全管理论坛成功举办,聚焦API安全分享落地实践
  3. 自恢复保险丝选型参数详解
  4. 借贷记账法下的账户对应关系_2017年会计基础考点之借贷记账法下的账户对应关系与会计分录...
  5. 分享一篇十分钟学会正则表达式教程
  6. mssql和mysql那个好_mssql与mysql的有什么区别?哪个更好用?
  7. HTTP协议中的Content-Length
  8. 一文读懂元宇宙生态Plato Farm,治理通证PLATO的价值
  9. 全屏背景图片动画插件 vegas.min.js
  10. 机器学习算法(八):关联分析