我使用的是一个javax.sql.rowset.CachedRowSet对象,我在代码中传递它。填充它的ResultSet在将CachedRowSet传递给其余代码之前关闭(仅用于读取,我不以任何方式更新或修改它):
public CachedRowSet getData(String query) throws SQLException {
RowSetFactory aFactory = RowSetProvider.newFactory();
CachedRowSet crs = aFactory.createCachedRowSet();
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
crs.populate(rs);
} finally {
DbUtils.closeQuietly(null, stmt, rs);
}
return crs;
}考虑到上面的设置,当我完成close()或release()对象时,CachedRowSet对象也是有意义的吗?This answer似乎暗示close()并没有伤害,但是没有解决release(),或者两者之间的区别。我想我可以做一个release(),然后是一个close(),以防万一,但我想了解得更多一些。请注意,我甚至序列化了CachedRowSet对象,然后将其从另一个模块中的String中内部化,这样我也可以在重新内化的实例上调用close()和release(),这没有任何意义。
发布于 2014-01-07 14:53:28
我想我不完全理解你的问题。但是..。
realese() ->释放该CachedRowSet对象的当前内容,并向所有已注册的侦听器发送rowSetChanged事件。任何未完成的更新都将被丢弃,并且在调用此方法之后,行集将不包含任何行。没有与基础数据源的交互,任何行集内容、元数据和内容更新都应该是不可恢复的。链接:(http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/CachedRowSet.html)
close() ->它继承自ResultSet,它会立即释放ResultSet对象的数据库和JDBC资源,而不是等待它自动关闭时发生。
ResultSet对象的关闭不会关闭由ResultSet创建的Blob、Clob或NClob对象。Blob、Clob或NClob对象至少在创建它们的事务期间仍然有效,除非调用它们的空闲方法。
关闭ResultSet时,通过调用getMetaData方法创建的任何ResultSetMetaData实例仍然是可访问的。
注意: CachedRowSet不能使连接保持活动状态。它只是在执行查询或更新时需要一个连接。
希望它有帮助:)
https://stackoverflow.com/questions/19758657
复制相似问题