关于java:com.ibm.db2.jcc.am.SqlException:[jcc] [10120] [11936] [4.14.88]无效的操作:Lob已关闭。错误代码= -4470,SQLSTATE =空

com.ibm.db2.jcc.am.SqlException: [jcc][10120][11936][4.14.88] Invalid operation: Lob is closed. ERRORCODE=-4470, SQLSTATE=null

在我们的应用程序中,我们有一个简单的POJO类,其中包含Clob属性。

在获取该Clob实体的String表示形式时遇到问题。

说我已经在POJO对象中查询并缓存了结果,现在我正尝试获取Clob的String值,如下所示。

1
2
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已关闭。错误代码= -4470,SQLSTATE =空

我想念什么吗?


可以通过将progressiveStreaming=2;参数添加到连接url

来解决此问题

完全指定的连接URL如下所示:

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

如果该参数有异常,请向其添加以下内容,或添加这些参数中的任何一个或组合以对其进行修复:

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

最好使用db2jcc4.jar


Clob Java对象不是数据库中存储的Clob值的副本。它是一个定位器(指针),在关闭结果集后将变为无效。在处理结果集时,您将需要复制Clob内容。


对于hibernate用户,当映射到数据库Lob类型(BLOB或CLOB)时,该字段应使用@Lob注释,并且无需保留副本,您可以将其直接转换为字符数组,如

1
2
3
4
5
(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;在您的数据源配置属性中。