0
我有5k個字符可以從oracle數據庫的每一行讀取爲CLOB作爲選擇列表查詢。在使用springjdbc執行查詢之後,在嘗試將CLOB對象轉換爲String時拋出下面的異常。在讀取clob對象時彈簧jdbc模板連接關閉異常
public List<MasterData> findByRqstId(int rqstId) {
String sql = "SELECT * FROM MASTER_DATA WHERE REQUEST_ID = ?";
List<MasterData> masterDataList = getSimpleJdbcTemplate().query(sql,
ParameterizedBeanPropertyRowMapper.newInstance(MasterData.class), rqstId);
return masterDataList;
}
Caller Code
masterDataList = masterDataDao.findByRqstId(rqstId);
String outputResponse=null;
if (masterDataList != null && masterDataList.size() > 0) {
for (MasterData mData : masterDataList) {
Clob clob = mData.getOutputResponse();
InputStream in = clob.getAsciiStream();
StringWriter w = new StringWriter();
IOUtils.copy(in, w);
String clobAsString = w.toString();
outputResponse = clob.toString();
}
}
我能夠得到clob對象。但是當我嘗試使用上面的代碼將對象轉換爲字符串時,我得到連接關閉異常。
Exception in thread "main" java.sql.SQLRecoverableException: Close Connection
at oracle.sql.CLOB.getDBAccess(CLOB.java:1421)
at oracle.sql.CLOB.getAsciiStream(CLOB.java:352)
據我所知,由於clob對象的大小較大,緩存無法爲下一個操作保存數據。以下屬性沒有區別。
<property name="connectionProperties" value="defaultRowPrefetch=1000" />
<property name="connectionProperties" value="defaultLobPrefetchSize=500000" />
問題是,當你訪問clob時,產生它的連接已經關閉。您應該在傳遞給JDBC模板的映射器中執行此操作。附註:你確定你需要使用'getAsciiStream'而不是'getCharacterStream'嗎? –