2014-03-12 222 views
1

在我們的應用程序中,我們有一個簡單的POJO類,其中有一個Clob屬性。com.ibm.db2.jcc.am.SqlException:[jcc] [10120] [11936] [4.14.88]操作無效:Lob關閉。 ERRORCODE = -4470,SQLSTATE = null

我在獲取該實體的字符串表示的那個Clob實體時遇到問題。

說我已經查詢並緩存了POJO對象中的結果,現在我試圖按如下所示獲取Clob的字符串值。

int aLength = (int)myPojo.getClobField().length(); 
String aStringValue = myPojo.getClobField().getSubString(1L, aLength); 

但上面的執行給我的錯誤,

com.ibm.db2.jcc.am.SqlException:[JCC] [10120] [11936] [88年4月14日]操作無效:Lob已關閉。 ERRORCODE = -4470,SQLSTATE = null

我錯過了什麼嗎?

回答

1

Clob Java對象不是存儲在數據庫中的CLOB值的副本。它是一個定位器(指針),它在結果集關閉後變爲無效。處理結果集時,您需要複製CLOB內容。

+0

感謝您的回覆。所以更好的選擇是在我的POJO中有一個String字段,我將使用'Clob'的'getSubString()'來初始化它。是嗎? – Kannan

+0

我不知道什麼是最適合你的,因爲我不知道你的要求。 – mustaccio

2

這個問題可以通過增加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

0

對Hibernate的用戶,當映射到數據庫高球類型(BLOB或CLOB)字段應註明@Lob並沒有必要保留副本,您可以directely它轉換到字符數組一樣

(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;在您的數據源配置屬性中。

相關問題