2016-02-09 63 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对象。内部我想春天照顾的转换,但其工作正常。