Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring jdbc模板连接在读取clob对象时关闭异常_Java_Jdbc_Apache Commons_Spring Jdbc - Fatal编程技术网

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

Java Spring jdbc模板连接在读取clob对象时关闭异常,java,jdbc,apache-commons,spring-jdbc,Java,Jdbc,Apache Commons,Spring Jdbc,对于select list查询,我需要从oracle DB中的每一行读取5个以上的字符作为CLOB。使用springjdbc执行查询后,在尝试将CLOB对象转换为字符串时抛出以下异常 public List<MasterData> findByRqstId(int rqstId) { String sql = "SELECT * FROM MASTER_DATA WHERE REQUEST_ID = ?"; List<

对于select list查询,我需要从oracle DB中的每一行读取5个以上的字符作为CLOB。使用springjdbc执行查询后,在尝试将CLOB对象转换为字符串时抛出以下异常

    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对象的大小更大,缓存无法为下一个操作保存数据。以下属性没有任何区别

    <property name="connectionProperties" value="defaultRowPrefetch=1000" />

    <property name="connectionProperties" value="defaultLobPrefetchSize=500000" /> 


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

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

解决办法可以是:

  • 在Dao本身中设置数据并返回VO
  • 通过事务管理器(调用者)启动事务 必须是事务管理器)

  • 问题是,当您访问clob时,产生clob的连接已经关闭。您应该在传递给JDBC模板的映射器中执行此操作。旁注:您确定需要使用
    getascistream
    而不是
    getCharacterStream
        <property name="connectionProperties" value="defaultRowPrefetch=1000" />
    
        <property name="connectionProperties" value="defaultLobPrefetchSize=500000" />