我们有很多遗留代码连接到数据库,并返回一个像这样的结果集,并且在这里依赖于一个依赖的JAR:我可以注意到它可能会改变它。
在关闭结果集时的调用方法中,底层语句保持打开状态。
有没有办法通过底层结果集关闭语句?
答案 0 :(得分:2)
CachedRowSet对象的特殊之处在于它可以无需操作 连接到它的数据源,也就是说,它是一个断开连接的RowSet 宾语。它的名字源于它存储(缓存)它的名称 内存中的数据,以便它可以在自己的数据上而不是在数据上运行 存储在数据库中的数据。
CachedRowSet接口是所有已断开连接的超级接口 RowSet对象,所以这里演示的一切也适用于 WebRowSet,JoinRowSet和FilteredRowSet对象。
将连接的结果集转换为disconnected RowSet
并关闭Statement/PreparedStatement
和Connection
,然后再返回RowSet
。
您必须在.close()
块中调用finally
以确保代码已运行!
public void badFormPassingAroundConnectedResultSets(@Nonnull final ResultSet rs)
{
try
{
while (rs.next()) { /* do something */ }
}
catch (final SQLException e)
{
throw new RuntimeException(e); // or log.error() but NEVER empty
}
finally
{
try { rs.getStatement().getConnection().close(); }
catch (final SQLException e) { LOG.error(e.getMessage(), e); }
}
}
}
在.close()
对象上调用Connection
会在所有引用它的子对象上调用.close()
。