jdbc如何在嵌套查询中处理连接的关闭问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdbc如何在嵌套查询中处理连接的关闭问题相关的知识,希望对你有一定的参考价值。
比方我一个查询方法1中间会调用到另一个查询方法2,当查询方法2结束后会关闭connection,怎么才能让connectiion结束后先不关闭connection,而等方法1结束后才关闭。
但是当独立运行方法1的时候要能关闭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如何在嵌套查询中处理连接的关闭问题的主要内容,如果未能解决你的问题,请参考以下文章