`
buerkai
  • 浏览: 169291 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JDBC中ResulrSet

 
阅读更多
JDBC1.0 、JDBC2.0 、JDBC3.0 中分别用以下方法创建Statement 。
JDBC1.0 : createStatement()
JDBC2.0 : createStatement(resultSetType, resultSetConcurrency)
JDBC3.0 : createStatement(resultSetType, resultSetConcurrency, resultSetHoldability)

下面依次分析resultSetType 、resultSetConcurrency 、resultSetHoldability 这几个参数的含义。

一 ResultSetType
      resultSetType 的可选值有: ResultSet.TYPE_FORWARD_ONLY 、ResultSet.TYPE_SCROLL_INSENSITIVE 、ResultSet.TYPE_SCROLL_SENSITIVE 。

1 :ResultSet.TYPE_FORWARD_ONLY

默认的cursor 类型,仅仅支持结果集forward ,不支持backforward ,random ,last ,first 等操作。 

2 :ResultSet.TYPE_SCROLL_INSENSITIVE

支持结果集backforward ,random ,last ,first 等操作,对其它session 对数据库中数据做出的更改是不敏感的。

实现方法:从数据库取出数据后,会把全部数据缓存到cache 中,对结果集的后续操作,是操作的cache 中的数据,数据库中记录发生变化后,不影响cache 中的数据,所以ResultSet 对结果集中的数据是INSENSITIVE 的。

3 :ResultSet.TYPE_SCROLL_SENSITIVE

支持结果集backforward ,random ,last ,first 等操作,对其它session 对数据库中数据做出的更改是敏感的,即其他session 修改了数据库中的数据,会反应到本结果集中。

实现方法:从数据库取出数据后,不是把全部数据缓存到cache 中,而是把每条数据的rowid 缓存到cache 中,对结果集后续操作时,是根据rowid 再去数据库中取数据。所以数据库中记录发生变化后,通过ResultSet 取出的记录是最新的,即ResultSet 是SENSITIVE 的。 但insert 和delete 操作不会影响到ResultSet ,因为insert 数据的rowid 不在ResultSet 取出的rowid 中,所以insert 的数据对ResultSet 是不可见的,而delete 数据的rowid 依旧在ResultSet 中,所以ResultSet 仍可以取出被删除的记录( 因为一般数据库的删除是标记删除,不是真正在数据库文件中删除 )。

做个试验,验证一下SENSITIVE 特性。数据库为oracle10g ,驱动为ojdbc14.jar 。

test 表中数据如下:

c1 c2 c3
1c1 1c2 1c3
2c1 2c2 2c3
3c1 3c2 3c3

程序如下:

public static void testResultSetSensitive(Connection conn) throws Exception{
String sql = "SELECT c1,c2,c3 FROM test";
try {
Statement stmt =
       conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {
System.out.println("[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2)
+ "\t" + rs.getString(3));
  Thread.sleep(20000);
}

rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (Exception e) {
}
}
}
       
定义ResultSet 为 ResultSet. TYPE_SCROLL_SENSITIVE 类型,首先执行 sql 访问数据库,然后执行 rs.next() 移动游标取数据。在循环里面加上 Thread.sleep (20000) 的目的是为了我们有时间在后台把数据库里的数据改了。比如当在循环里打印出第一行的数据后,我们在后台,把第三行数据的 c3 列改成 ”3uuu” 。如果 ResultSet 真的是敏感的话,那应该取出 ”3uuu” ,而不是原始的“ 3c 3 ”。但最终的结果却是如下:

[ 行号: 1] 1c1   1c2   1c3
[ 行号: 2] 2c1   2c2   2c3
[ 行号: 3] 3c1   3c2   3c3

数据没变呀,ResultSet 不敏感啊!于是去查阅资料,找了n 久,还是在英文文档上找到了答案。原来是fetchsize 的问题。调用ResultSet 的next 方法取数据时,并不是每调用一次方法就去数据库里查一次,而是有个fetchSize, 一次取fetchSize 条数据。Oracle 默认的fetchsize 等于10 ,所以上面的代码在第一次调用rs.next() 时,就已经把3 条数据都取出来了,所以才会有上面的结果。

      第二次实验,在ResultSet rs = stmt.executeQuery(sql); 前面加上 stmt.setFetchSize(1); 将fetchSize 设置为1 。然后重新第一次实验的步骤,发现最 终结果为:

[ 行号: 1] 1c1   1c2   1c3

[ 行号: 2] 2c1   2c2   2c3

[ 行号: 3] 3c1   3c2   3uuu

    原因就是 fetchsize 设置为 1 时,每次 next 取数时都会重新用 rowid 取数据库里取数据,当然取到的是最新的数据了。

      二 ResultSetConcurrency

      ResultSetConcurrency的可选值有2个:
      ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只读的,不可以修改
      ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以任意修改,然后更新到数据库,可以插入,删除,修改。

      三 ResultSetHoldability
   ResultSetHoldability 的可选值有2 个 :

     HOLD_CURSORS_OVER_COMMIT: 在事务commit 或rollback 后,ResultSet 仍然可用。
     CLOSE_CURSORS_AT_COMMIT: 在事务commit 或rollback 后,ResultSet 被关闭。

     需要注意的地方:

   1 :Oracle 只支持HOLD_CURSORS_OVER_COMMIT 。

   2 :当Statement 执行下一个查询,生成第二个ResultSet 时,第一个ResultSet 会被关闭,这和是否支持支持HOLD_CURSORS_OVER_COMMIT 无关。

     四 验证数据库是否支持ResultSet的各种特性

不同的数据库版本及 JDBC 驱动版本,对 ResultSet 的各种高级特性的支持是不一样的,我们可以通过以下方法,来验证具体的数据库及 JDBC 驱动,是否支持 ResultSet 的各种特性。

     DatabaseMetaData dbMeta = conn.getMetaData();

      然后调用 DatabaseMetaData 对象的以下方法:

       boolean supportsResultSetType(int resultSetType);

       boolean supportsResultSetConcurrency(int type, int concurrency);

       boolean supportsResultSetHoldability(int holdability);

分享到:
评论

相关推荐

    JDBC 解析JDBC中文API

    JDBC 解析JDBC中文API各种数据库之间的链接问题,网络编程

    Jdbc连接oracle远程数据库中文乱码解决

    在这个文件中,我们可以配置JDBC连接池,同时指定字符集,确保数据传输时的编码一致性。例如: ```xml ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 其他配置项 --> ``` 2. **JDBC...

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    在IT行业中,数据库连接是应用程序与数据存储之间的桥梁,而JDBC(Java Database Connectivity)则是Java平台中用于访问数据库的标准API。JDBC Driver 3.0是针对Java开发者的重要组件,它允许Java应用程序与各种...

    jdbc 中文参考文档

    jdbc (java数据库连接)中文参考文档 chm格式

    sqljdbc和sqljdbc4 sqlserver最新驱动

    这两个版本都是JDBC(Java Database Connectivity)驱动,允许Java开发者在应用程序中与SQL Server进行交互。下面将详细介绍这两个驱动以及如何使用它们。 1. SQLJDBC驱动: SQLJDBC是微软发布的早期版本的JDBC...

    Spring Data JDBC与JDBC的区别

    Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...

    sqljdbc41、sqljdbc42的官方jar包

    在Java编程语言中,JDBC(Java Database Connectivity)是一个核心的API,用于连接Java应用程序与各种类型的数据库。这里我们关注的是两个特定版本的Microsoft SQL Server的JDBC驱动:sqljdbc41.jar和sqljdbc42.jar...

    sqljdbc4.jar, sqljdbc41.jar, sqljdbc42.jar三个包

    标题中的"sqljdbc4.jar, sqljdbc41.jar, sqljdbc42.jar"是指Microsoft SQL Server为Java应用程序提供的Java Database Connectivity (JDBC)驱动程序。这些JAR文件是数据库连接的关键,允许Java代码与SQL Server进行...

    jdbc.zip_java jdbc_java+jdbc_jdbc_jdbc Java_zip

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种关系数据库进行交互的一组接口和类。它作为标准API,允许开发人员通过编写Java代码来访问和操作数据库,无需了解数据库特定的SQL语法或者驱动...

    JDBC 4.3规范文档

    在本规范文档中,我们可以了解到JDBC 4.3版本所支持的特性,其中API的版本号和维持状态信息表明了当前文档处于维护发布状态。这一版的规范在2017年2月被发布,是对之前版本的更新和改进。Oracle America, Inc.作为...

    sqlserver驱动包 jdbc驱动 sqljdbc.jar和sqljdbc4.jar

    在Java中,JDBC驱动通常分为四种类型:Type 1、Type 2、Type 3和Type 4。sqljdbc.jar和sqljdbc4.jar属于Type 4,即纯Java实现的驱动,无需依赖于数据库供应商的特定接口或中间件,因此具有较好的跨平台性。 要使用...

    Dm7JdbcDriver16.jar Dm7JdbcDriver17.jar Dm7JdbcDriver18.jar

    在给定的压缩包文件中,包含了三个不同版本的达梦JDBC驱动,分别是Dm7JdbcDriver16.jar、Dm7JdbcDriver17.jar和Dm7JdbcDriver18.jar。 1. **JDBC驱动介绍**: JDBC是Java中用于与各种数据库进行交互的标准接口,它...

    eclipse中jdbc连接的jar包

    标题"eclipse中jdbc连接的jar包"指的是在Eclipse中使用JDBC进行数据库连接时所需的jar包。这些jar包通常包含了JDBC驱动,使得Java程序能够建立到数据库的连接,执行SQL语句,并处理结果集。 描述中的"Myeclipse中...

    jdbc jdbc jdbc

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems(现为Oracle公司)开发并定义,作为Java平台的一部分,允许Java应用程序通过编写Java代码来访问...

    jdbc核心代码.docx

    1. SQLException:JDBC中的异常处理,SQLException是JDBC中的基本异常类,用于处理数据库操作中的异常。 2. 数据类型转换:JDBC提供了多种数据类型转换的方法,例如getInt()、getString()等。 3. Statement和...

    mysql jdbc 驱动 适用于5.7及以上版本数据库

    mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上...

    sqljdbc42.jar、sqljdbc41.jar 更新日期2017-12-21

    标题中的"sqljdbc42.jar、sqljdbc41.jar 更新日期2017-12-21"指的是Microsoft SQL Server的Java Database Connectivity (JDBC) 驱动的两个不同版本,它们分别对应于Java SE 7和Java SE 8的兼容性。JDBC驱动是Java...

    hana jdbc ngdbc.jar com.sap.db.jdbc.Driver

    这个驱动类是连接 SAP HANA 的关键,因为它实现了 JDBC 规范中的接口,使得 Java 应用能够与 HANA 数据库通信。 标签 "hana jdbc jar ngdbc.jar" 明确指出,这个话题主要涉及 SAP HANA、JDBC 和 `ngdbc.jar` 文件。...

    sap JDBC数据源配置

    1. **创建 JDBC 系统**:在 NetWeaver Administrator 中创建一个新的 JDBC 系统。 2. **指定连接详情**:包括 JDBC URL、用户名和密码等。 3. **测试连接**:确保配置正确无误后,测试连接。 #### BI JDBC 系统...

Global site tag (gtag.js) - Google Analytics