com.ibm.db2.jcc.am.SqlException:[jcc] [10120] [11936] [4.14.88]无效操作:Lob关闭。 ERRORCODE = -4470,SQLSTATE = null

时间:2014-03-12 18:31:02

标签: java jdbc db2 clob

在我们的应用程序中,我们有一个简单的 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

我错过了什么吗?

3 个答案:

答案 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;在您的数据源配置属性中。