通过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:
我碰到了这个链接,发帖人在其中滚动了自己的补丁。如果事实证明它是安全有效的,我们正在考虑将其实现为自己使用。
事实证明,这是使用 会话池 以外的任何方法时都会发生的pgBouncer问题。我们正在使用 事务池 ,它显然不支持准备好的语句。通过切换到
会话池 ,我们解决了这个问题。
不幸的是,这对于我们的用例来说不是一个好的解决方案。我们对pgBouncer有两种不同的用法:我们系统的一部分进行批量更新,这对于准备好的语句最有效,而另一部分则需要非常快速的连续进行许多连接。由于pgBouncer不允许在
会话池 和 事务池
之间来回切换,因此我们被迫在不同的端口上运行两个单独的实例,以仅满足我们的需求,或者实施此补丁。初步测试表明它可以正常工作,但是时间会证明它是否安全有效。
问题内容: 我使用准备好的语句编写了select语句。每次尝试运行时都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做
Java代码如下所示: 以下是我正在使用的所有东西的版本,以供参考:
我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?
问题内容: 我使用准备好的语句编写了select语句。每次尝试运行它都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做