文档章节

JDBC_ResultSet && Statement

秋风醉了
 秋风醉了
发布于 2014/11/11 17:36
字数 1211
阅读 108
收藏 0
点赞 0
评论 0

JDBC_ResultSet和Statement_fetchSize_maxRows

ResultSet

ResultSetType

先通过ResultSetType来了解一下ResultSet,看这个类表示什么含义:

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对数据库中数据做出的更改是不敏感的。

3 :ResultSet.TYPE_SCROLL_SENSITIVE

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

 

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);

 

setFetchSize()

看java doc是如何解释的:

/**
 * Gives the JDBC driver a hint as to the number of rows that should
 * be fetched from the database when more rows are needed for this
 * <code>ResultSet</code> object.
 * If the fetch size specified is zero, the JDBC driver
 * ignores the value and is free to make its own best guess as to what
 * the fetch size should be.  The default value is set by the
 * <code>Statement</code> object
 * that created the result set.  The fetch size may be changed at any time.
 *
 * @param rows the number of rows to fetch
 * @exception SQLException if a database access error occurs; this method
 * is called on a closed result set or the
 * condition {@code rows >= 0} is not satisfied
 * @since 1.2
 * @see #getFetchSize
 */
void setFetchSize(int rows) throws SQLException;

 * Gives the JDBC driver a hint as to the number of rows that should

 * be fetched from the database when more rows are needed for this

 * <code>ResultSet</code> object.

 * If the fetch size specified is zero, the JDBC driver

 * ignores the value and is free to make its own best guess as to what

 * the fetch size should be.  The default value is set by the

 * <code>Statement</code> object

 * that created the result set.  The fetch size may be changed at any time.

我的理解是当设置了fetchSize时,假设现在有100条数据,现在fetchSize=20,那么当ResultSet.TYPE_FORWARD_ONLY时,你通过如下的方式访问数据:

ResultSet rs = st.executeQuery(sql); // 执行sql查询语句,返回查询数据的结果集
System.out.println("最后的查询结果为:");
while (rs.next()) { // 判断是否还有下一个数据
	// 根据字段名获取相应的值
	String first_name = rs.getString("first_name");
	String last_name = rs.getString("last_name");

	// 输出查到的记录的各个字段的值
	System.out.println("first_name=" + first_name + " "
			+ "last_name=" + last_name);

}

那么每次获取数据的条数就是20,那么五次就可以把全部数据拿到。但是如果fetchSize是0,那么每循环一次就要从数据库获取一次数据,这个查询过程要在循环100次后结束。。

同时,在这个查询过程中数据库服务器的资源一直被这个查询占用中,浪费了服务器资源。

关于mysql客户端和服务器如何通信的过程请看该文章:http://my.oschina.net/xinxingegeya/blog/343109

 

Statement_fetchSize

在Statement中也可以设置fetchSize的大小,但会被ResultSet中的setFetchSize覆盖。

/**
 * Gives the JDBC driver a hint as to the number of rows that should
 * be fetched from the database when more rows are needed for
 * <code>ResultSet</code> objects generated by this <code>Statement</code>.
 * If the value specified is zero, then the hint is ignored.
 * The default value is zero.
 *
 * @param rows the number of rows to fetch
 * @exception SQLException if a database access error occurs,
 * this method is called on a closed <code>Statement</code> or the
 *        condition {@code rows >= 0} is not satisfied.
 * @since 1.2
 * @see #getFetchSize
 */
void setFetchSize(int rows) throws SQLException;

这里的fetchSize和上面讲的都是同一个道理。

 

Statement_maxRows

这个java doc中对maxRows的描述

/**
 * Sets the limit for the maximum number of rows that any
 * <code>ResultSet</code> object  generated by this <code>Statement</code>
 * object can contain to the given number.
 * If the limit is exceeded, the excess
 * rows are silently dropped.
 *
 * @param max the new max rows limit; zero means there is no limit
 * @exception SQLException if a database access error occurs,
 * this method is called on a closed <code>Statement</code>
 *            or the condition {@code max >= 0} is not satisfied
 * @see #getMaxRows
 */
void setMaxRows(int max) throws SQLException;

 * Sets the limit for the maximum number of rows that any

 * <code>ResultSet</code> object  generated by this <code>Statement</code>

 * object can contain to the given number.

 * If the limit is exceeded, the excess

 * rows are silently dropped.

通过这个解释可以知道当sql中有limit的限制的时候,这个设置会silently dropped.

其实和limit的作用是一样的。

但是maxRows和fetchSize的具体区别就要好好区分了

=============END=============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 222
博文 581
码字总数 411013
作品 0
东城
程序员
D 语言数据库驱动层 - Dbal

Dbal 是 HuntLabs 开发的D语言(dlang)数据库驱动层,类似 PHP 的 PDO、JAVA 的 JDBC,内置连接池支持。 目前支持的数据库驱动: PostgreSQL 8+ MySQL 5.1+ SQLite 3+ 示例代码 import std...

冰力 ⋅ 05/14 ⋅ 0

使用Hibernate+MySql+native SQL的BUG,以及解决办法

本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据)。 查询方法是: 错误信息: 看到最后Caused by: java.sql.SQLException: 所以我...

thinkyoung ⋅ 2015/01/15 ⋅ 0

Java获取MySQL数据库数据

Java获取MySQL数据库数据 工具:Eclipse navicat MySQL MySQL连接驱动:mysql-connector-java-5.1.42.jar 加载驱动: 把下载好的的包导入工程项目中: 导入包 接着创建数据库: 在company的数...

幸运券发放 ⋅ 04/21 ⋅ 0

70个学习JAVA必背的英语单词,了解下

以下是整理的70个在JAVA在学习JAVA的时候经常遇到的英文单词 1、Compile:编绎 2、Run:运行 3、Class:类 4、Object:对象 5、System:系统 6、out:输出 7、print:打印 8、line:行 9、variable:...

编程大侠 ⋅ 04/11 ⋅ 0

webLogic JNDI连接池监控

我要做一个weblogic数据源的监控,监控当前连接池连接数量,最大连接数,超过某个阀值就发邮件或者短信报警。webloigc提供的后台只能看,没有报警功能,所以我想自己实现一个。现在可以获取到...

OSC_ZORO ⋅ 06/15 ⋅ 0

JavaWeb07-HTML篇笔记(二)

1.1 案例一:使用JDBC完成CRUD的操作:1.1.1 需求: 对分类管理使用JDBC进行CRUD的操作. 1.1.2 分析:1.1.2.1 技术分析: 【JDBC的概述】 Ø JDBC:Java DataBase Connectivity Java数据库的连...

我是小谷粒 ⋅ 05/16 ⋅ 0

MySQL多数据源笔记5-ShardingJDBC实战

Sharding-JDBC集分库分表、读写分离、分布式主键、柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案。 从2.x版本开始,Sharding-JDBC正式将包名、Maven坐标、码云仓...

狂小白 ⋅ 03/19 ⋅ 0

java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。 java.sql.Date是java.util.Date的子类,是一个包装了毫秒 值的瘦包装器,允许 JDBC 将毫秒值标识...

村长大神 ⋅ 2015/02/02 ⋅ 0

Java 5 、6、 7中新特性

JDK5新特性(与1.4相比)【转】 1 循环 for (type variable : array){ body} for (type variable : arrayList){body} 而1.4必须是: for (int i = 0; i < array.length; i++){ type variabl......

thinkyoung ⋅ 2014/10/14 ⋅ 0

每个项目中,你必须知道的11个Java第三方类库。

Java第三方library ecosystem是一个很广阔的范畴。不久前有人撰文:每个项目中,你必须知道的11个Java第三方类库。 单元测试 1.DBUnit DBunit是一个基于junit扩展的数据库测试框架。它提供了...

thinkyoung ⋅ 2015/01/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 19分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 21分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 22分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 36分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 41分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 43分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 43分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 43分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 44分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部