com.ibm.db2.jcc.am.SqlException: [jcc] [10120] [11936] [4.14.88] Недопустимая операция: Lob закрыт. ERRORCODE = -4470, SQLSTATE = null

1

В нашем приложении у нас есть простой класс POJO, в котором есть атрибут Clob.

У меня возникла проблема с получением строкового представления этого объекта Clob.

Скажем, я уже запросил и кэшировал результат в объекте POJO, теперь я пытаюсь получить значение String для Clob, как показано ниже.

int aLength = (int)myPojo.getClobField().length();
String aStringValue = myPojo.getClobField().getSubString(1L, aLength);

Но приведенное выше исполнение дает мне ошибку,

com.ibm.db2.jcc.am.SqlException: [jcc] [10120] [11936] [4.14.88] Недопустимая операция: Lob закрыт. ERRORCODE = -4470, SQLSTATE = null

Я что-то упускаю?

Теги:
db2
jdbc
clob

3 ответа

1
Лучший ответ

Объект Clob Java не является копией значения CLOB хранящегося в базе данных. Это локатор (указатель), который становится недействительным после закрытия результирующего набора. Вам нужно будет скопировать содержимое CLOB во время обработки набора результатов.

  • 0
    Спасибо за ответ. Поэтому лучшим вариантом было бы иметь поле String в моем POJO, которое я инициализирую с помощью getSubString() из Clob . Это?
  • 0
    Я не знаю, что лучше для вас, потому что я не знаю ваших требований.
2

Эта проблема может быть решена путем добавления progressiveStreaming=2; аргумент URL-адреса подключения

Полностью указанный URL-адрес подключения должен быть указан ниже:

jdbc:db2://localhost:50000/SAMPLE:progressiveStreaming=2;

В случае, если у вас есть исключение из этого параметра, добавьте в него следующее или добавьте какой-либо один или несколько комбинаций этих параметров, чтобы исправить это:

jdbc:db2://localhost:50000/SAMPLE:driverType=4;fullyMaterializeLobData=true;fullyMaterializeInputStreams=true;progressiveStreaming=2;progresssiveLocators=2;

Предпочтительно использовать db2jcc4.jar

0

Для пользователей спящего режима при сопоставлении с базой данных типа LOB (BLOB или CLOB) поле должно быть аннотировано @Lob и не нужно сохранять копию, вы можете прямо преобразовать ее в массив символов, например

(java.sql.Clob)payload.field1 bodyText = clobTest.getCharacterStream() 
 targetString = org.apache.commons.io.IOUtils.toString(bodyText) 
int length=targetString.length();
payload.PAYLOADHEADERS=targetString
return payload

Убедитесь, что вы добавили progressiveStreaming = 2; в свойствах конфигурации источника данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню