【发布时间】:2014-02-13 20:11:09
【问题描述】:
我将 Spring 的 JdbcTemplate 与 PostgreSQL 一起使用。当我的应用程序执行以下代码行时,会引发错误。该方法包含其他只读查询执行链接在一行中,在它到达特定行之前。
jdbcTemplate 似乎关闭了连接,在 java.sql.Array 可以从 Map 中提取之前。
public void writeGeoRelation(Long id){
...
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
for (Map<String, Object> map : list) {
Long[] arr = (Long[]) ((Array) map.get("foo")).getArray(); //Erroneous line
}
}
这是堆栈跟踪:
org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822)
at org.postgresql.jdbc3.AbstractJdbc3Connection.prepareStatement(AbstractJdbc3Connection.java:273)
at org.postgresql.jdbc2.AbstractJdbc2Connection.prepareStatement(AbstractJdbc2Connection.java:301)
at org.postgresql.jdbc2.TypeInfoCache.getArrayDelimiter(TypeInfoCache.java:337)
at org.postgresql.jdbc2.AbstractJdbc2Array.buildArrayList(AbstractJdbc2Array.java:372)
at org.postgresql.jdbc2.AbstractJdbc2Array.getArrayImpl(AbstractJdbc2Array.java:160)
at org.postgresql.jdbc2.AbstractJdbc2Array.getArray(AbstractJdbc2Array.java:128)
at com.company.geo.director.GeoDirector.writeGeoRelation(GeoDirector.java:438)
你知道我怎样才能强制连接保持打开而不退回到普通的 Jdbc 吗?我真的很想继续使用 Spring Jdbc。
【问题讨论】:
-
如果这是交易的一部分,您能否也强调一下?我怀疑这也取决于最大超时时间。
-
@dharam 上面的代码 sn-p 是执行多个查询的方法的一部分,一个接一个......或者你所说的事务到底是什么意思?
-
Ok..事务的概念是这样的,如果对数据库有多个查询(由少量更新等组成),那么事务中的每一件事要么成功,要么全部回滚。它还会导致关闭连接。这也可能导致问题。
-
...但到目前为止,该方法中没有更新/插入。尽管如此,我会尝试将其包装到事务中并看看会发生什么。 (+1 用于简要介绍交易)
-
@dharam 你是对的。用 Transactional 注释包装方法解决了这个问题。如果你写一个答案,我会接受它!
标签: java spring jdbc jdbctemplate