处理大数据对象,应该释放Clob吗?

时间:2019-03-21 07:13:56

标签: java jdbc resources resultset clob

我正在使用带有ojdbc7驱动程序的Oracle数据库 我正在使用(Clob)rs.getObject("DATA")从ResultSet中获取Clob,然后在方法中将其转换为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对象至少在创建它们的事务期间保持有效。在长时间运行的事务中,这可能导致应用程序资源不足。应用程序可以通过调用免费方法来释放Blob,Clob和NClob资源。

     

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

我应该添加更多代码以在finally中发布:

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

是不是微不足道的加法,是因为Clob不在方法外使用,还是有一种简单/本地的方式从数据库的大对象中获取字符串?

1 个答案:

答案 0 :(得分:1)

在该方法之外未使用Clob的事实并不意味着调用free()是没有用的:如果不调用它,则至少将资源的释放延迟到交易结束(如Oracle文档所说)。 Do java.sql.Array/Blob/Clob types need to be "free()"ed?Should JDBC Blob (not) be free()'d after use?JDBC 4's java.sql.Clob.free() method and backwards compatibility

中也对此进行了讨论。

关于从Clob获取字符串的简单/本地方法,请参见Most efficient solution for reading CLOB to String, and String to CLOB in Java?