当通过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();
}
});
有人见过这个吗?
Edit 1:
这是一个pgBouncer问题,当使用session pooling以外的任何东西时都会发生.我们使用的是transaction pooling,它显然不能支持预先准备好的语句.通过切换到session pooling,我们绕过了这个问题.
不幸的是,对于我们的用例来说,这不是一个很好的解决方案.pgBouncer有两种不同的用途:我们系统的一部分进行批量更新,这在准备语句时是最有效的,另一部分需要快速连续的许多连接.由于pgBouncer不允许在session pooling和transaction pooling之间来回切换,我们不得不在不同的端口上运行两个单独的实例来支持我们的需求.
Edit 2:
我遇到了this link个,海报上有他自己的补丁.我们目前正在考虑将其用于我们自己的用途,如果它被证明是安全有效的.