Spring jdbc模板连接在读取clob对象时关闭了异常

时间:2016-02-09 07:32:52

标签: java jdbc apache-commons spring-jdbc

我有5k +个字符从oracle DB中的每一行读取一个选择列表查询的CLOB。使用springjdbc执行查询后,在尝试将CLOB对象转换为String时抛出以下异常。

    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" /> 

2 个答案:

答案 0 :(得分:1)

我能够通过将它转换为String数据类型来检索clob对象。我觉得Spring负责转换,但它的工作正常。

答案 1 :(得分:0)

出现异常的原因是,当您访问blob / clob时,连接已关闭。

解决方案可能是:

  1. 在Dao本身中设置数据并返回VO
  2. 通过事务管理器(调用方)启动事务 必须是交易经理)。