Хобрук: Ваш путь к мастерству в программировании

Blob в Oracle: около 15% заполнено \00

В Weblogic 10 я использую Hibernate для хранения данных в нескольких таблицах с BLOB. Это всегда работало нормально, но клиент обнаружил определенные обстоятельства, когда 15% BLOB-объектов имеют правильный размер, но содержат только нулевые символы. Я не могу понять, что делает его хорошим или полным пустоты.

Тип BLOB, который я использую, выполняет:

public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
    if (value == null) {
        st.setNull(index, sqlTypes()[0]);
        return;
    }

    try {
        Connection conn = st.getConnection();
        if (conn instanceof org.apache.commons.dbcp.DelegatingConnection) {
            log.debug("Delegating connection, digging for actual driver");
            conn = ((org.apache.commons.dbcp.DelegatingConnection)st.getConnection()).getInnermostDelegate();
        }
        OutputStream tempBlobWriter = null;
        BLOB tempBlob = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
        try {
            tempBlob.open(BLOB.MODE_READWRITE);
            tempBlobWriter = tempBlob.setBinaryStream(1L);
            tempBlobWriter.write((byte[])value);
            tempBlobWriter.flush();
        } finally {
            if (tempBlobWriter != null)
                tempBlobWriter.close();
            tempBlob.close();
        }

        st.setBlob(index, (Blob) tempBlob);
    } catch (IOException e) {
        throw new HibernateException(e);
    }
}

Я помещаю туда журнал и могу подтвердить, что значение (byte[]) хорошее. Я пытался изменить параметры createTemporary, но безуспешно.

Я запускаю это под Weblogic 10.0 (не могу обновить это) с помощью прилагаемого драйвера Oracle Thin.

Подсказка заключается в том, что рабочие вызовы исходят от стандартной веб-службы, развернутой и управляемой WLS. Но проблемные вызовы выполняются из потока, запущенного вместе с компонентом, который взаимодействует с какой-то устаревшей системой с JNI. Этот поток работает как шарм для всего, кроме этих BLOB. Я получаю новую сессию непосредственно перед вставкой данных и закрываю ее немного позже. (Сеанс НЕ остается открытым в течение всего времени существования потока)

Я установил уровень журнала Hibernate на DEBUG, но это не дает мне никакой подсказки. У меня начинают заканчиваться идеи...


Ответы:


1

Задача решена.

На самом деле я делал:

  • open session
    • open transaction
      • get first item from legacy system
      • записать первый элемент в базу данных (большой двоичный объект)
    • закрыть транзакцию
    • open transaction
      • get second item from legacy system
      • записать второй элемент в базу данных (большой двоичный объект)
    • закрыть транзакцию
    • ... пока устаревшей системе больше нечего будет обрабатывать
  • закрыть сеанс

Обычно это обрабатывает от 1 до 5 элементов за раунд.

Но поскольку драйвер Oracle не использует стандартный способ обработки больших двоичных объектов в JDBC, наш пользовательский тип должен создавать временный большой двоичный объект, который сохраняется в сеансе. И, очевидно, когда вы вставляете большие двоичные объекты в разные транзакции в рамках одного сеанса, они, как правило, мешают и вызывают мою проблему.

Я решил это, закрыв сеанс после каждого коммита. Мне это не нравится, но я считаю, что это вина драйвера Oracle.

20.10.2009
Новые материалы

Пожалуй, лучший пост, который я читал за последнее время.
Пожалуй, лучший пост, который я читал за последнее время. Мне за 30, и я могу относиться к большей части истории. Действительно отличные идеи, которые помогли мне снова сосредоточиться на..

100 дней кода машинного обучения — День 097
Подведение итогов дня 096 В дни 095 и 096 мы говорили о том, как мы слышим звук в пространстве: время интерауральной задержки, передаточная функция, связанная с головой, а также мы говорили..

Какова ваша «история данных»?
Представление концепций продуктов для данных и машинного обучения заинтересованным сторонам и руководству Все любят данные. Все любят говорить, как будто понимают данные. Всем нравится..

Все, что вам нужно знать о «Внимании» и «Трансформерах» — Углубленное понимание — Часть 2
Внимание, Самостоятельное внимание, Многоголовое внимание, Маскированное многоголовое внимание, Трансформаторы, BERT и GPT В предыдущем рассказе я объяснил, что такое механизм внимания, а также..

Расставание с локальным хранилищем
Что такое локальное хранилище Локальное хранилище — это механизм, который позволяет веб-приложениям хранить данные на стороне клиента. Это часть API веб-хранилища, которое также включает в себя..

CycleGAN: как машинное обучение обучает непарному преобразованию изображения в изображение
Недавно я прочитал статью CycleGAN ( ссылка ), которая показалась мне очень интересной, потому что модели CycleGAN обладают невероятной способностью точно преобразовывать изображения во что-то, чем..

«Изучение передовых технологий: подробный обзор последних инноваций в области технологий…
Технологии постоянно развиваются, и последние инновации в технологической отрасли могут изменить наш образ жизни и работы так, как мы никогда не считали возможным. В этой статье подробно..