Чтение CLOB из БД Oracle после закрытия соединения с БД - PullRequest
2 голосов
/ 03 февраля 2011

В одном из рассматриваемых мной классов 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;
 }

oracle.sql.CLOB, возвращаемый getCLOB (), читается другим методом:

 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 (который, на мой взгляд, является справочным) после закрытия основного соединения с базой данных. Чего мне не хватает?

РЕДАКТИРОВАТЬ: еще один момент, который стоит отметить, что этот код работает на сервере приложений. Persistence.getConnection () получает соединение из источника данных (наиболее вероятно с пулом соединений). Интересно, используется ли соединение с базой данных после его возвращения в пул соединений?

EDIT2: использование соединения после его возврата в пул может не являться причиной. Сервер приложений - сервер Oracle Glassfish Websphere , и я надеюсь, что они защитят от такого использования.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Драйвер JDBC предварительно выбирает выбранные объекты в набор результатов. Read API может использовать буферы предварительной выборки без связи. Размер буфера, указанный параметром oracle.jdbc.defaultLobPrefetchSize со значением по умолчанию 4000.

1 голос
/ 03 февраля 2011

Вы должны иметь возможность просто использовать getString () для этого столбца.

Текущие драйверы больше не требуют использования интерфейса CLOB.

(по крайней мере, у меня это работает с обычными инструкциями SELECT)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...