转:http://xujunprogrammer.blog.hexun.com/31265955_d.html
JDBC2.0后提出了三种不同的cursor类型,用户代码可以在创建Statement指定cursor类型,如下:
Statement createStatement( int resultSetType, int resultSetConcurrency)
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,需要进行二次查询,效率最低,开销最大
分享到:
相关推荐
### JDBC详解 #### 一、JDBC概述 JDBC(Java Database Connectivity)是Java平台上的标准数据库连接技术,它提供了一套API(Application Programming Interface),允许Java程序与各种类型的数据库进行交互。通过...
#### 四、ResultSet接口的使用详解 **4.1 ResultSet接口介绍** - `next()`:移动游标到下一行。 - `getString(int columnIndex)`:根据列索引获取字符串值。 - `getInt(int columnIndex)`:根据列索引获取整数值。...
`ResultSet` 内部维护了一个游标,可以通过 `next()` 方法逐行遍历结果集中的记录。 - **遍历 ResultSet**:使用 `while (rs.next())` 循环来遍历每一行数据。 - **获取数据**:使用 `get×××` 方法获取特定列的...
`ResultSet`中的`next()`方法移动内部游标到下一行,`getString()`方法根据列名获取对应的字符串值。 除了基本的`Statement`,通常推荐使用`PreparedStatement`,因为它可以防止SQL注入攻击,并且在处理参数化查询...
5. **ResultSet**:当执行查询后,结果通常返回一个`ResultSet`对象,它是一个游标,可以遍历查询结果。`Statement.execute()`方法执行SQL查询后返回`ResultSet`。 使用JDBC访问数据库的基本步骤如下: 1. 加载...
- `next()`方法:这是ResultSet接口中最常用的方法之一,它将游标向下移动一行,并返回一个布尔值,表示当前行是否存在。如果存在,可以通过getXXX方法获取当前行的数据。 ```java while(rs.next()){ // 获取数据 ...
- 游标:使用`Cursor`类处理复杂查询,支持游标滚动和定位。 - 面向对象的数据库操作:OCCI支持对对象类型(如LOBs、Collections)的操作。 通过Oracle培训PPT,开发者可以系统学习并掌握OCCI的使用技巧,从而在...
5. **游标与结果集** - **结果集类型**: ResultSet的类型有TYPE_FORWARD_ONLY、TYPE_SCROLL_INSENSITIVE和TYPE_SCROLL_SENSITIVE,分别代表只向前滚动、不可变的滚动和可变的滚动。 - **结果集并发**: CONCUR_READ...
例如,我们可以使用ResultSet的absolute()方法来移动游标到指定的位置。 ```java public ResultSet queryPageAbsolute(String sql, int firstSize, int maxSize) throws SQLException { PreparedStatement pre = ...
- ResultSet是游标模型,可以按行移动。默认情况下,它位于第一行之前,调用next()方法移动到下一行。 - 使用getter方法(如getInt(), getString())获取列数据。 5. **批处理** - 对于大量相似的SQL操作,...
注意,`ResultSet`的游标初始位置位于第一行之前,通过`next()`方法移动到下一行。 7. **关闭连接**:为避免资源泄漏,操作完成后应依次关闭`ResultSet`、`Statement`和`Connection`。 #### 三、高级主题:...
它是一个只读的、向前移动的游标,允许开发者遍历查询结果。 - **作用**: 存储数据库查询结果。 - **关键方法**: - `next()`:将游标移动到下一个行。 - `getString(int columnIndex)`:获取指定列的字符串值。 ...
JDBC 3.0引入了`ResultSet`的游标方法,允许在结果集中定位并处理特定行,比如`absolute()`、`relative()`和`last()`。 7. **批注(Annotations)** J2SE 5.0引入了注解,JDBC 3.0也对其进行了支持,如`@Column`...
<parameter property="p3" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap"/> {?=call packageName.functionName(?,?,?)} ``` 在此例中,`p3`被定义为一个游标...
在JDBC中使用的`ResultSet`对象就利用了隐式游标的原理。 **2. 显示游标** 显示游标需要用户自己定义、打开、获取和关闭。 ```sql DECLARE CURSOR myc IS SELECT * FROM EMP; -- 声明游标 myremp%ROWTYPE; BEGIN ...
#### 一、JDBC基本步骤详解 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。使用JDBC访问数据库通常遵循以下步骤...
### 第五节 ResultSet接口的使用详解 ResultSet是执行查询后返回的结果集,包含了来自数据库的多行数据。通过移动游标来遍历结果集,获取每一行的数据。 ### 第六节 JDBC中数据类型详解 JDBC定义了一套与数据库交互...
#### 数据连接池工作机制详解 数据连接池是现代应用程序设计中一个重要的组成部分,尤其在高并发的环境下,它可以显著提高数据库访问效率和应用性能。当J2EE服务器启动时,它会根据配置初始化一个连接池,预创建...