В нашем приложении у нас есть простой класс 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
Я что-то упускаю?
Объект Clob
Java не является копией значения CLOB
хранящегося в базе данных. Это локатор (указатель), который становится недействительным после закрытия результирующего набора. Вам нужно будет скопировать содержимое CLOB
во время обработки набора результатов.
Эта проблема может быть решена путем добавления 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
Для пользователей спящего режима при сопоставлении с базой данных типа 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; в свойствах конфигурации источника данных.
getSubString()
изClob
. Это?