文档章节

JDBC_ResultSet && Statement

秋风醉了
 秋风醉了
发布于 2014/11/11 17:36
字数 1211
阅读 116
收藏 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=============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 577
码字总数 418437
作品 0
朝阳
程序员
java开发中jdbc连接数据 库的操作代码

JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Cla...

颜建海
2014/04/04
0
0
Postgres查询结果集的获取方法及其优缺点

PG jdbc的查询结果集获取方式 1 简单全部结果集查询 默认情况下,pgjdbc是一次获取全部查询结果的,并且结果集的类型和并发性分别为ResultSet.TYPEFORWARDONLY和ResultSet.CONCURREADONLY。也...

YuanyuanL
2015/03/18
0
0
SpringData入门笔记(一) - 重温jdbc操作

学习Spring Data之前,我们先通过几种基础的、常见的方式访问数据库,然后再通过Spring Data的方式访问,可以分别其中的优劣,对它们有一个更好的了解。 目标 有一个学生表,属性有id/name/a...

dotleo
2017/11/05
0
0
析评数据库连接池(创世纪新篇)

学习Java语言,对于数据库连接池不陌生啦。例如,一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不...

crossmix
2015/08/21
0
0
follow大神教程——实践java爬虫之六

朕已无力吐糟实验室的网速了。。。 10点半左右开机,网线、wifi都连不上,右下角wifi连上但有黄色叹号, QQ错误码:0x00000001 表示访问网络失败 ipconfig,擦,本机为私有IP,连路由器都连不...

realsa
2014/07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js 操作cookie

var cookie = {// 设置cookie方法set:function(key, val, time){// 获取当前时间var date = new Date();// 将date设置为n天以后的时间var expiresDays = time;//...

小丶二
15分钟前
1
0
限制root远程登录 su和sudo命令

9月21日任务 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录 对于Linux而言,权限的重要性毋庸置疑!对于普通用户而言无法执行那些只有root用户才能有效的命令,导致工作无法有效进行; 系统...

robertt15
17分钟前
2
0
MQTT协议的初浅认识之通讯级别和持久会话

背景 这是我最近了解MQTT协议的最后一部分内容了,MQTT协议里面的QOS和Keep Alive是两个比较重要的内容。QOS的设置,直接影响了订阅客户端与中间件之间的消息交互行为。而Keep Alive直接影响...

亚林瓜子
19分钟前
1
0
calc

width: calc(100% - 30px); 特别注意:减号左右空格,均不能去掉。 width: calc(100% - 30px);

柴高八斗之父
28分钟前
1
0
Spring Cloud Gateway全局过滤器GlobalFilter:返回消息和重定向

Spring Cloud Gateway的全局过滤器GlobalFilter,顾名思义,声明后会对所有的请求生效,可以用来做权限控制,这里简单记录一下拦截到非法请求后如何返回自定义信息和将请求重定向到指定URL。...

夜雨寄北09
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部