JDBC 中 ResultSet 不生效的原因以及 MySQL 与 Oracle 所支持的 ResultSet Type 的总结

AUTHOR | nicechi
类别 | MySQL
发表 | 2020-09-12 23:12:30
更新 | 2020-09-13 07:23:18

有时候即便在创建 Statement 对象的时候将 ResultType 设置成了 ResultSet.TYPE_FORWARD_ONLY,却依然可以在 ResultSet 对象中任意的移动而且不会报错。

这十有八九是因为所使用的数据库或者 Driver 本身并不支持这种的 ResultSet 类型,一般来说可以通过 DatabaseMetaData 的 supportsResultSetType() 来查看当前的 connection 是否支持某一种的 ResultSet 类型:

final String URL = "...";
Connection connection=DriverManager.getConnection(URL);
DatabaseMetaData md=connection.getMetaData();

if( md.supportsResultSetType( ResultSet.TYPE_FORWARD_ONLY ) )
	System.out.println( " ****** 当前 connection 支持 Type_FORWARD_ONLY ****** " );
else
	System.out.println( " ****** 当前 connection 不支持 Type_FORWARD_ONLY ****** " );

下面的表格总结了 MySQL 与 Oracle 数据库对常见的几个 ResultSet 类型的支持情况:

 Oracle 11gMySQL 8.0MySQL 5.7
所使用的驱动ojdbc 8mysql-connector 8.0.xmysql-connector 8.0.x 与
mysql-connector 6.0x
    
TYPE_FORWARD_ONLY

(只有使用 mysql-connector 8.0.x 时才会生效)

TYPE_SCROLL_INSENSITIVE
TYPE_SCROLL_SENSITIVE
    
CONCUR_READ_ONLY
CONCUR_UPDATABLE
    
CLOSE_CURSORS_AT_COMMIT
CLOSE_CURSORS_OVER_COMMIT

可见,Oracle 与 MySQL 相比,所支持的 ResultSet 类型会更加地全面。

同时,通过测试发现,MySQL 5.7 在使用 mysql-connector 6.0x 驱动的情况下并不支持 TYPE_FORWARD_ONLY,但是使用 mysql-connector 8.0.x 驱动的话就可以支持 TYPE_FORWARD_ONLY,可见除了数据库本身会影响着 JDBC 对于 ResultSet 类型的支持之外,所使用的驱动也会影响着 JDBC 对于 ResultSet 类型的支持。

 

 

 


CATEGORY

TOP