java - 处理大数据对象,应该释放 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
没有使用外部方法,或者是否有一种简单/原生的方式从数据库中的大对象获取字符串?
解决方案
没有在该方法之外使用 clob 的事实并不意味着调用free()
是没有用的:如果你不调用它,你至少会延迟资源的释放,直到事务结束(正如 Oracle 的文档所说)。这也在Do java.sql.Array/Blob/Clob 类型是否需要“free()”中进行了讨论?并且JDBC Blob(不是)在使用后应该是 free() 的吗?和JDBC 4 的 java.sql.Clob.free() 方法和向后兼容性
关于从 clob 获取字符串的简单/原生方式,请参阅在 Java 中将 CLOB 读取到字符串和字符串到 CLOB 的最有效解决方案?
推荐阅读
- java - problem recived the earthquake JSON result
- javascript - 文件路径导航变得很奇怪
- javascript - Discord.js 在电子游戏的地图列表中计算 2 支球队的胜率
- xml - OfficeJs Word 删除作者的评论
- python - macOS 14 中的 pybind11
- vue.js - 无法在 vue2 的 facebook 登录回调中调用另一个函数
- asp.net - ASP.Net Gridview Sort 使用模板代码隐藏例程来计算单元格数据
- swift - 试图快速从 API 获取一些数据,我迷路了,我做错了什么?
- openai-gym - 成功率不随基线增加
- android - 如何在 Play Store 上构建一键式移动应用部署?