关闭数据库连接后从Oracle DB读取CLOB

时间:2011-02-03 12:26:24

标签: java oracle jdbc

在我正在审核的一个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 ,我希望他们能够防范这种用法。

2 个答案:

答案 0 :(得分:2)

JDBC驱动程序预取选定到结果集中的LOB。 Read API可以使用预取缓冲区 没有联系。 oracle.jdbc.defaultLobPrefetchSize参数指定的缓冲区大小,默认值为4000。

答案 1 :(得分:1)

您应该能够在该列上使用getString()。

当前的驱动程序不再需要使用CLOB接口。

(至少它适用于常规SELECT语句)