2016-02-09 97 views
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" /> 
+0

問題是,當你訪問clob時,產生它的連接已經關閉。您應該在傳遞給JDBC模板的映射器中執行此操作。附註:你確定你需要使用'getAsciiStream'而不是'getCharacterStream'嗎? –

回答

0

我能夠通過將其轉換爲字符串數據類型來檢索clob對象。內部我想春天照顧的轉換,但其工作正常。