`
yt
  • 浏览: 17147 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入理解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,需要进行二次查询,效率最低,开销最大
分享到:
评论
7 楼 williamou 2007-10-04  
讲得好清楚,
谢谢!
6 楼 yt 2007-09-26  
ResultSet.TYPE_SCROLL_SENSITIVE 是对选取出来所有rowid对应记录的update操作敏感
5 楼 e3002 2007-09-24  
好帖啊
4 楼 dsl 2007-09-21  
还有一个问题请教楼主,ResultSet.TYPE_SCROLL_SENSITIVE  是不是只对 ResultSet 内的update 操作敏感啊?
还望解答
3 楼 simon1118 2007-09-17  
讲得很仔细,学到了
2 楼 Cecily 2007-09-15  
说的挺清楚的呵呵
1 楼 zongxing 2007-09-15  
好贴。

相关推荐

    非常好的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应用...

    JDBC驱动及JAR包

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

    sqlserver驱动包:sqljdbc4.jar

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

    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