【问题标题】:Spring Jdbctemplate with PostgreSQL: connection already closed when accesing java.sql.ArraySpring Jdbctemplate with PostgreSQL:访问 java.sql.Array 时连接已关闭
【发布时间】: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


【解决方案1】:

您可以考虑在DAO 或调用DAO 的服务中的方法上使用@Transactional

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

既然你说问题已经解决了,我就不在这里写了,更多关于 Spring 的内容请参考我的博客:TechieMe

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2011-06-02
    相关资源
    最近更新 更多