如何通过结果集关闭语句?

时间:2014-12-08 16:37:12

标签: java jdbc

我们有很多遗留代码连接到数据库,并返回一个像这样的结果集,并且在这里依赖于一个依赖的JAR:我可以注意到它可能会改变它。

在关闭结果集时的调用方法中,底层语句保持打开状态。

有没有办法通过底层结果集关闭语句?

1 个答案:

答案 0 :(得分:2)

您永远不应传递连接的结果集:

  

CachedRowSet对象的特殊之处在于它可以无需操作   连接到它的数据源,也就是说,它是一个断开连接的RowSet   宾语。它的名字源于它存储(缓存)它的名称   内存中的数据,以便它可以在自己的数据上而不是在数据上运行   存储在数据库中的数据。

     

CachedRowSet接口是所有已断开连接的超级接口   RowSet对象,所以这里演示的一切也适用于   WebRowSet,JoinRowSet和FilteredRowSet对象。

将连接的结果集转换为disconnected RowSet并关闭Statement/PreparedStatementConnection,然后再返回RowSet

Using CachedRowSets Tutorial

如果你做错了,这是处理它的正确方法:

您必须在.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()