在我们的应用程序中,我们有一个简单的 POJO 类,其中包含 Clob 属性。
我在获取 Clob 实体的字符串表示时遇到问题。
假设我已经查询并缓存了 POJO 对象中的结果,现在我正在尝试获取Clob的String值,如下所示。
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
我错过了什么吗?
答案 0 :(得分:2)
可以通过向连接URL
添加progressiveStreaming=2;
参数来解决此问题
完整指定的连接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
答案 1 :(得分:1)
Clob
Java对象不是存储在数据库中的CLOB
值的副本。它是一个定位器(指针),在结果集关闭后变为无效。在处理结果集时,您需要复制CLOB
个内容。
答案 2 :(得分:0)
对于hibernate用户,当映射到数据库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;在您的数据源配置属性中。