Postgres - 错误:准备好的语句 "S_1" 已经存在
Postgres - 错误:准备好的语句 "S_1" 已经存在
在使用JDBC批量查询pgbouncer时,我遇到了以下错误:
org.postgresql.util.PSQLException: ERROR: prepared statement "S_1" already exists
我在网上找到了一些错误报告,但它们似乎都是与Postgres 8.3或更低版本有关,而我们使用的是Postgres 9。
以下是触发错误的代码:
this.getJdbcTemplate().update("delete from xx where username = ?", username); this.getJdbcTemplate().batchUpdate( "INSERT INTO xx(a, b, c, d, e) " + "VALUES (?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, value1); ps.setString(2, value2); ps.setString(3, value3); ps.setString(4, value4); ps.setBoolean(5, value5); } @Override public int getBatchSize() { return something(); } });
有人以前遇到过这个问题吗?
编辑1:
结果发现这是一个pgBouncer的问题,当使用除了会话池以外的任何东西时会出现。我们使用的是事务池,显然无法支持预处理语句。通过切换到会话池,我们解决了这个问题。
不幸的是,这对我们的用例来说并不是一个好的解决办法。我们的系统有两个独立的pgBouncer使用场景:系统的一部分进行批量更新,最有效的方式是使用预处理语句,而另一部分需要在非常快的连续操作中使用许多连接。由于pgBouncer不允许在会话池和事务池之间来回切换,我们被迫在不同的端口上运行两个独立的实例来满足我们的需求。
编辑2:
我在这个链接上看到了一个帖子,该帖子的自己做了一个补丁。如果这个补丁被证明是安全和有效的,我们目前正在考虑为我们自己的用途实施它。