`

深入理解JDBC Scrollable ResultSet

阅读更多

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,需要进行二次查询,效率最低,开销最大

分享到:
评论
2 楼 InviteSun 2010-06-04  
上边那一段分析看不大懂....
1 楼 dolphin_ygj 2009-07-20  
可滚动结果集(可双向滚动)
  批处理更新  ***
  可更新结果集   
 
1、批处理更新
Statement
addBatch(String sql), 方法会在批处理缓存中加入一条sql语句
executeBatch() ,执行批处理缓存中的所有sql语句。

PreparedStatement

addBatch() 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
executeBatch() 将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
PreparedStatement中使用批量更新时,要先设置好参数后使用addBatch()方法加入缓存。
注意:批量更新中只能使用更新或插入语句

execute(String sql),这个方法的返回值是boolean类型,如果返回true就表示sql是一个select语句,可以通过getResultSet()获得结果集,如果是false,sql就是DML语句或者是DDL语句。


2、可滚动结果集(可双向滚动),这种结果集不但可以双向滚动,相对定位,绝对定位,并且可以修改数据信息。

滚动特性
next(),此方法是使游标向下一条记录移动。
previous() ,此方法可以使游标上一条记录移动,前提前面还有记录。
absolute(int row),可以使用此方法跳到指定的记录位置。定位成功返回true,不成功返回false,返回值为false,则游标不会移动。
afterLast() ,游标跳到最后一条记录之后。
beforeFirst() ,游标跳到第一条记录之前。(跳到游标初始位)
first(),游标指向第一条记录。
last(),有彪指向最后一条记录。
relative(int rows) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向下移动指定值,参数为负,游标从当前位置向上移动指定值。

TYPE_FORWARD_ONLY ,该常量指示指针只能向前移动的 ResultSet 对象的类型。

TYPE_SCROLL_INSENSITIVE ,该常量指示可滚动但通常不受其他的更改影响的 ResultSet 对象的类型。
TYPE_SCROLL_SENSITIVE ,该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。
         
要使用可滚动结果集时,要在Statement创建时指定参数,才可以使用
Statement st=null;
st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)

ResultSet结果集中,先使用moveToInsertRow(),将游标移到和结果集结构类似的缓冲区中
然后可以使用updateXxx(int column,columnType value)方法来更新指定列数据,
再使用insertRow() 方法插入记录,
最后将游标指回原位,moveToCurrentRow() 。

能否使用可更新结果集,要看使用的数据库驱动是否支持,
还有只能用于单表且表中有主键字段(可能会是联合主键),不能够有表连接,会取所有非空字段且没有默认值。

能否使用JDBC2.0 ResultSet的新特性要看数据库驱动程序是否支持。


3、SQL3.0中的行类型

Array,数组
Sturct,结构
Blob,大的二进制数据文件。
Clob,大文本文件对象。
在使用上述大对象的时候,在使用JDBC插入记录时要先插入一个空的占位对象,然后使用
select blobdata from t_blob where id = " + id + " for update 这样的语法来对获得的大对象,进行实际的写入操作 Blod通过getBinaryOutputStream()方法获取流进行写入。getBinaryStream()方法获得流来获取blob中存储的数据。
clob的操作也和blob相同。getAsciiStream() 方法用于读取存储的文本对象,getAsciiOutputStream()方法之获得流用来向文件对象写入的。

相关推荐

    非常好的jdbc3.0

    2. **ResultSet的增强**:提供了scrollable和updatable的ResultSet。Scrollable ResultSet允许开发者前后移动结果集,而不仅仅是按顺序读取。Updatable ResultSet则允许在结果集中直接修改数据,然后通过ResultSet的...

    非常全面JDBC资源

    这个全面的JDBC资源集合旨在为不同水平的开发者提供深入理解和使用JDBC所需的知识,无论你是初学者还是有一定经验的程序员,都可以从中受益。 **一、JDBC基础** 1. **JDBC驱动**: JDBC驱动是Java与数据库之间的桥梁...

    JDBC与Java数据库程序设计

    - 游标和Scrollable ResultSet - JDBC的并发和多线程支持 - JDBC的元数据查询 - SQL的存储过程调用 - 高级连接池配置 综上所述,JDBC是Java程序员掌握数据库操作的必备技能,其丰富的API和灵活的特性使得Java应用...

    sqlserver驱动包:sqljdbc4.jar

    首先,让我们深入了解`sqljdbc4.jar`中的关键组件和功能: 1. **连接管理**:`com.microsoft.sqlserver.jdbc.SQLServerDriver`类是JDBC驱动的核心,实现了`java.sql.Driver`接口。通过调用`Class.forName(...

    JDBC驱动及JAR包

    - 当处理大量数据时,考虑使用ResultSet的scrollable和updatable特性,或者使用流式ResultSet以降低内存消耗。 - 安全性:避免硬编码数据库凭证,使用加密或连接池管理用户凭据。 7. **JDBC驱动的版本管理**: ...

    sqljdbc.jar

    对于大数据量的查询,可以使用ResultSet的scrollable和updatable特性,或者通过流处理减少内存消耗。 `sqljdbc.jar`的源码分析可以帮助开发者更深入地理解其内部工作原理,从而优化性能或解决特定问题。通过查看...

    JDBC API数据库编程实作教材

    本教材《JDBC API数据库编程实作教材》深入浅出地讲解了如何利用JDBC进行数据库编程。 1. **JDBC基础** - JDBC API的核心是Java.sql包,其中包含了DriverManager、Connection、Statement、ResultSet等关键接口和类...

    JDBC 3.0 高级变成

    《JDBC 3.0 高级编程》是一部深入探讨Java数据库连接(JDBC)技术的著作,尤其关注JDBC 3.0版本的特性与实践。本资源包含丰富的学习代码,旨在帮助开发者从初级到高级,全面掌握JDBC的核心知识。 JDBC是Java语言中...

    jdbc示例代码

    本篇将围绕“jdbc示例代码”这一主题,深入探讨相关的知识点,包括batch处理、滚动游标、事务管理和DML操作,以及PreparedStatement的使用。 1. **Batch处理**: 在批量处理中,我们可以通过JDBC API一次性提交多...

    jdbc相关ppt

    3. **结果集处理**:JDBC提供了多种处理结果集的方式,如ForwardOnly、Scrollable、Updatable等,满足不同场景需求。`ResultSet.TYPE_FORWARD_ONLY`是默认模式,只能向前滚动;`ResultSet.TYPE_SCROLL_INSENSITIVE`...

    JDBC的博客源码.rar

    **JDBC(Java Database Connectivity)**是Java编程语言中用于规范...通过对博客中的JDBC源码进行学习,我们可以深入理解JDBC的工作原理,提升数据库操作的技能,同时也能更好地应用到实际项目中,提高代码质量和性能。

    《Java Enterprise 最佳实践》【1】 JDBC最佳实践

    《Java Enterprise 最佳实践》是Java开发者们深入理解企业级应用开发的重要参考资料,尤其是其中的JDBC最佳实践部分,对于数据库交互的优化和性能提升有着关键性的影响。JDBC(Java Database Connectivity)是Java...

    JDBC(ORACLE)

    2. **结果集缓存**:使用ResultSet的scrollable模式和类型,可以实现结果集的缓存,减少对数据库的压力。 3. **连接池**:通过DataSource管理连接,复用数据库连接,减少创建和关闭连接的开销。 总之,JDBC为Java...

    Java语言SQL接口—JDBC编程技术

    - Resultset的scrollable和updatable特性允许对结果集进行滚动和修改。 - PreparedStatement的batchUpdate()方法支持批量操作。 - Connection的prepareCall()用于处理存储过程。 9. JDBC的最佳实践 - 使用...

    Hibernate分页查询原理解读

    如果`hibernate.jdbc.use_scrollable_resultset`配置为`true`,则Hibernate会尝试使用JDBC的`ResultSet`接口提供的`absolute`方法直接跳转到指定的位置,从而实现快速定位和分页。 ```java if (session.getFactory...

    JDBC驱动

    **JDBC驱动详解** Java Database Connectivity (JDBC) 是Java平台中用于与各种数据库进行交互的一...理解并正确使用不同类型的JDBC驱动,以及掌握其工作原理和优化技巧,对于提升应用性能和保证数据安全具有重要意义。

    com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作 解决方案

    本文将深入探讨标题和描述中提到的“com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作”这一异常,以及如何在使用Hibernate、Struts进行分页时避免这一问题。我们将从异常的根本原因...

    jdbc高级优化

    可以使用ResultSet的scrollable功能,按需加载数据,或者使用流式处理(ResultSet.FETCH_FORWARD和ResultSet.CONCUR_READ_ONLY),避免一次性加载所有数据。 5. **关闭资源**:每次操作完数据库后,确保正确关闭...

    oracle JDBC 驱动包 10g 9i

    Oracle JDBC驱动支持多种类型的游标,如ForwardOnly、Scrollable等。 - 错误处理:在处理数据库操作时,可能会遇到各种错误。Oracle JDBC驱动提供了`SQLException`类来捕获和处理这些异常。 - 批量处理(Batch ...

    SQL数据库连接

    5. **结果集的迭代优化**:理解并使用ResultSet的scrollable和forward-only模式,以及fetch size属性,优化数据读取性能。 6. **异常处理**:学习如何优雅地处理JDBC操作中可能出现的SQLException,避免程序中断。 ...

Global site tag (gtag.js) - Google Analytics