首页 > 解决方案 > 处理大数据对象,应该释放 Clob 吗?

问题描述

我正在使用带有ojdbc7驱动程序的 Oracle 数据库,我正在使用从 ResultSet 获取 Clob (Clob)rs.getObject("DATA"),然后将其转换为方法中的 String:

private String clobToString(Clob data) {
    StringBuilder sb = new StringBuilder();
    try (Reader reader = data.getCharacterStream(); BufferedReader br = new BufferedReader(reader)){
        String line;
        while(null != (line = br.readLine())) {
            sb.append(line);
        }
    } catch (Exception e) {
        logger.error("Failed to read CLOB", e);         
    }    
    return sb.toString();
}

根据 Oracle 的Using Large Objects

Blob、Clob 和 NClob Java 对象至少在创建它们的事务期间保持有效。这可能会导致应用程序在长时间运行的事务期间耗尽资源。应用程序可以通过调用它们的 free 方法来释放 Blob、Clob 和 NClob 资源。

在以下摘录中,调用 Clob.free 方法以释放为先前创建的 Clob 对象持有的资源

我是否应该添加更多代码以发布finally

    finally {
        try {
            data.free();
        } catch (SQLException e) {
            logger.error("Failed to release Clob", e);
        }
    }    

或者它是微不足道的添加,因为Clob没有使用外部方法,或者是否有一种简单/原生的方式从数据库中的大对象获取字符串?

标签: javajdbcresourcesresultsetclob

解决方案


没有在该方法之外使用 clob 的事实并不意味着调用free()是没有用的:如果你不调用它,你至少会延迟资源的释放,直到事务结束(正如 Oracle 的文档所说)。这也在Do java.sql.Array/Blob/Clob 类型是否需要“free()”中进行了讨论?并且JDBC Blob(不是)在使用后应该是 free() 的吗?JDBC 4 的 java.sql.Clob.free() 方法和向后兼容性

关于从 clob 获取字符串的简单/原生方式,请参阅在 Java 中将 CLOB 读取到字符串和字符串到 CLOB 的最有效解决方案?


推荐阅读