日期:2014-05-16  浏览次数:20729 次

【原创】JDBC ResultSet分析

?

JDBC1.0 JDBC2.0JDBC3.0 中分别用以下方法创建Statement

JDBC1.0 createStatement()

JDBC2.0 createStatement(resultSetType, resultSetConcurrency)

JDBC3.0 : createStatement(resultSetType, resultSetConcurrency, resultSetHoldability)

?

下面依次分析resultSetTyperesultSetConcurrencyresultSetHoldability 这几个参数的含义。

?

一 ResultSetType

?

????? resultSetType 的可选值有: ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE

?

1 ResultSet.TYPE_FORWARD_ONLY

默认的cursor 类型,仅仅支持结果集forward ,不支持backforwardrandomlastfirst 等操作。??

?

2 ResultSet.TYPE_SCROLL_INSENSITIVE

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

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

?

3 ResultSet.TYPE_SCROLL_SENSITIVE

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

?

实现方法:从数据库取出数据后,不是把全部数据缓存到cache 中,而是把每条数据的rowid 缓存到cache 中,对结果集后续操作时,是根据rowid 再去数据库中取数据。所以数据库中记录发生变化后,通过ResultSet 取出的记录是最新的,即ResultSetSENSITIVE 的。insertdelete 操作不会影响到ResultSet ,因为insert 数据的rowid 不在ResultSet 取出的rowid 中,所以insert 的数据对ResultSet 是不可见的,而