带有PostgreSQL的Spring Jdbctemplate:访问java.sql.Array时连接已经关闭

时间:2014-02-13 11:05:45

标签: java spring jdbc jdbctemplate

我在PostgreSQL中使用 Spring的JdbcTemplate 。当我的应用程序执行下面的代码行时,会抛出错误。该方法包含在连接到该特定行之前连续排列的其他只读查询执行。

在从地图中提取 java.sql.Array 之前,jdbcTemplate似乎关闭了连接。

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。

1 个答案:

答案 0 :(得分:1)

您可以考虑使用@Transactional优先于DAO中的方法或调用DAO的服务。

事务确保操作序列的原子性。这恰恰意味着,要么一切都成功,要么在异常情况下回滚所有查询。 当事务中出现故障时,Spring会关闭连接并释放资源。如果没有事务,则没有人保证何时关闭连接(在一次调用从数据库成功返回后也可能关闭,并且对于下一次调用,可能会获得另一个连接。

当你声明问题已经解决时,我会停止在这里写,有关Spring的更多信息,请参阅我的博客:TechieMe