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

Posted

技术标签:

【中文标题】Spring jdbc模板连接在读取clob对象时关闭异常【英文标题】:Spring jdbc template connection closed exception while reading clob object 【发布时间】:2016-02-09 07:32:51 【问题描述】:

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

【问题讨论】:

问题是当您访问 clob 时,产生它的连接已经关闭。您应该在传递给 JDBC 模板的映射器中执行此操作。旁注:您确定需要使用getAsciiStream 而不是getCharacterStream 【参考方案1】:

我可以通过将 clob 对象转换为 String 数据类型来检索它。在内部我猜 Spring 负责转换,但它工作正常。

【讨论】:

【参考方案2】:

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

解决方案可能是:

    在 Dao 中设置数据并返回 VO 通过事务管理器(调用者)发起事务 必须是事务管理器)。

【讨论】:

以上是关于Spring jdbc模板连接在读取clob对象时关闭异常的主要内容,如果未能解决你的问题,请参考以下文章

spring-jdbc-aop事务

spring-boot jdbc 到 db2 的连接获取读取超时

JAVAEE——spring03:spring整合JDBC和aop事务

Spring03Spring的连接数据库以及JDBC模板

spring整合JDBC

Oracle JDBC Clob 插入问题 ORA-00942