我在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。
答案 0 :(得分:1)
您可以考虑使用@Transactional
优先于DAO
中的方法或调用DAO
的服务。
事务确保操作序列的原子性。这恰恰意味着,要么一切都成功,要么在异常情况下回滚所有查询。 当事务中出现故障时,Spring会关闭连接并释放资源。如果没有事务,则没有人保证何时关闭连接(在一次调用从数据库成功返回后也可能关闭,并且对于下一次调用,可能会获得另一个连接。
当你声明问题已经解决时,我会停止在这里写,有关Spring的更多信息,请参阅我的博客:TechieMe