Обрабатывать большой объект данных, должен выпустить Clob? - PullRequest
1 голос
/ 21 марта 2019

Я использую базу данных Oracle с ojdbc7 драйвером Я получаю Clob из ResultSet, используя (Clob)rs.getObject("DATA"), а затем конвертирую его в строку в методе:

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 Использование больших объектов

Java-объекты Blob, Clob и NClob остаются действительными по крайней мере в течение всей транзакции, в которой они были созданы. Это может привести к исчерпанию ресурсов приложения во время длительной транзакции. Приложения могут освобождать ресурсы Blob, Clob и NClob, вызывая их бесплатный метод.

В следующем фрагменте вызывается метод Clob.free для освобождения ресурсов, хранящихся для ранее созданного объекта Clob

Должен ли я добавить больше кода для выпуска в finally:

    finally {
        try {
            data.free();
        } catch (SQLException e) {
            logger.error("Failed to release Clob", e);
        }
    }    

Или это незначительное дополнение, потому что Clob не используется вне метода или существует простой / нативный способ получения String из большого объекта из базы данных?

1 Ответ

1 голос
/ 21 марта 2019

Тот факт, что clob не используется вне этого метода, не означает, что вызов free() бесполезен: если вы его не вызываете, вы задерживаете освобождение ресурсов по крайней мере до завершения транзакции (как говорит доктор Оракул). Это также обсуждается в Должны ли типы java.sql.Array / Blob / Clob быть «free ()» ed? и Должен ли JDBC Blob (not) быть free () d после использования ? и java.sql.Clob.free () метод JDBC 4 и обратная совместимость

О простом / нативном способе получения String из clob см. Наиболее эффективное решение для чтения CLOB в String и String в CLOB в Java?

...