java Lob关闭,ERRORCODE=-4470,SQLSTATE=null

5kgi1eie  于 2023-05-15  发布在  Java
关注(0)|答案(3)|浏览(189)

我使用的是IBM websphere commerce和db2,有以下代码

Clob clobVar = null;
if (result.elementAt(3) != null)
    clobVar = (Clob) result.elementAt(3);

if (clobVar == null) {
    infoTable.put("EInfo", "");
} else {
    stringTemp = clobVar.getSubString(1, (int) clobVar.length());
    infoTable.put("EInfo", stringTemp); 
}

代码工作正常,直到

clobVar = (Clob) result.elementAt(3);

但一旦行刑

stringTemp = clobVar.getSubString(1, (int) clobVar.length());

系统引发异常

[jcc][10120][11936][4.3.111]无效操作:Lob关闭。ERRORCODE=-4470,SQLSTATE=null

我做错了什么?
如何解决这个问题?

tjrkku2a

tjrkku2a1#

此问题可以通过向连接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

wd2eg0qa

wd2eg0qa2#

由于它对于评论来说太长了,我研究了一段时间,这里有一些解释为什么progressiveStreaming=2;可以工作:
它是DB2JDBC驱动程序的一个特殊参数,用于更改驱动程序处理大型对象(LOB)的方式。
如果参数包含在JDBCURL中,它将告诉DB2JDBC驱动程序“渐进地”流式传输LOB数据。这意味着驱动程序不会一次将LOB数据全部加载到内存中,而是在您访问数据时将其以小块或“块”的形式加载。
在大多数情况下,即使在ResultSet关闭之后,也可以访问LOB数据。这是因为即使在ResultSet关闭后,JDBC驱动程序仍然可以访问数据库中的底层LOB数据。
下面是如何在JDBC URL中使用参数的示例:

String url = "jdbc:db2://localhost:50000/MYDB:progressiveStreaming=2;";

请注意,progressiveStreaming=2;参数只适用于某些版本的DB2 JDBC驱动程序。确保您使用的是受支持的驱动程序版本。

ltqd579y

ltqd579y3#

If everything has worked earlier with same code...but the issue came up after db2 db change, then try below configuration..
db2set DB2_RESTRICT_DDF=TRUE

对我很有效。

相关问题