jdbc如何在嵌套查询中处理连接的关闭问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdbc如何在嵌套查询中处理连接的关闭问题相关的知识,希望对你有一定的参考价值。

比方我一个查询方法1中间会调用到另一个查询方法2,当查询方法2结束后会关闭connection,怎么才能让connectiion结束后先不关闭connection,而等方法1结束后才关闭。
但是当独立运行方法1的时候要能关闭connection

获取一个Connection实例,在方法的参数表中添加一个connection类型的参数。把实例传进去。在方法一中想怎么处理怎么处理~ 参考技术A 如果你写的是两个public,就可以不用考虑这个,因为两个方法里的connection是不同对象,

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

【中文标题】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 通过事务管理器(调用者)发起事务 必须是事务管理器)。

【讨论】:

以上是关于jdbc如何在嵌套查询中处理连接的关闭问题的主要内容,如果未能解决你的问题,请参考以下文章

嵌套查询与连接查询的区别是啥

如何在 Graphql 中连接嵌套查询?

如何使用 Laravel 查询构建器编写嵌套连接?

如何重写这个嵌套的 SQL 查询以使其更快? [关闭]

Spring JDBC Template 无法执行 FROM 子句中包含嵌套查询的查询

如何使用 Laravel 的查询构建器执行嵌套连接?