在我正在审核的一个Java类中,我看到以下代码
private oracle.sql.CLOB getCLOB() {
oracle.sql.CLOB xmlDocument = null;
CallableStatement cstmt = null;
ResultSet resultSet = null;
Connection connection = null;
try {
connection = Persistence.getConnection();
cstmt = connection.prepareCall("{call pkg.proc(?,?)}");
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.setString(2, id);
cstmt.execute();
resultSet = (ResultSet)cstmt.getObject(1);
if (resultSet.next()) {
xmlDocument = ((OracleResultSet) resultSet).getCLOB(1);
}
} finally {
Persistence.closeAll(resultSet, cstmt, connection);
}
return xmlDocument;
}
getCLOB()返回的oracle.sql.CLOB在另一个方法中读取:
private void anotherMethod() {
...
oracle.sql.CLOB xmlDocument = getCLOB();
clobLength = xmlDocument.length();
chunkSize = xmlDocument.getChunkSize();
textBuffer = new char[chunkSize];
for (int position = 1; position <= clobLength; position += chunkSize) {
charsRead = xmlDocument.getChars(position, chunkSize, textBuffer);
outputBufferedWriter.write(textBuffer, 0, charsRead);
}
...
}
我是这个项目的新手,这里的人说这段代码正在运行。我不明白在底层数据库连接关闭后我们如何读取CLOB(在我的理解中,它是一个引用)。我错过了什么?
编辑:需要注意的另一点是此代码在app服务器中运行。 Persistence.getConnection()从数据源(很可能是连接池)获取连接。我想知道数据库连接是否在返回连接池后使用。
EDIT2:将连接返回池后使用可能不是原因。应用服务器是Oracle的Glassfish服务器 Websphere ,我希望他们能够防范这种用法。
答案 0 :(得分:2)
JDBC驱动程序预取选定到结果集中的LOB。 Read API可以使用预取缓冲区 没有联系。 oracle.jdbc.defaultLobPrefetchSize参数指定的缓冲区大小,默认值为4000。
答案 1 :(得分:1)
您应该能够在该列上使用getString()。
当前的驱动程序不再需要使用CLOB接口。
(至少它适用于常规SELECT语句)