我正在使用带有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
不在方法外使用,还是有一种简单/本地的方式从数据库的大对象中获取字符串?
答案 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?