当通过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 poolingtransaction pooling之间来回切换,我们不得不在不同的端口上运行两个单独的实例来支持我们的需求.

Edit 2:

我遇到了this link个,海报上有他自己的补丁.我们目前正在考虑将其用于我们自己的用途,如果它被证明是安全有效的.

推荐答案

这是一个pgBouncer问题,当使用session pooling以外的任何东西时都会发生.我们使用的是transaction pooling,它显然不能支持预先准备好的语句.通过切换到session pooling,我们绕过了这个问题.

不幸的是,对于我们的用例来说,这不是一个很好的解决方案.pgBouncer有两种不同的用途:我们系统的一部分进行批量更新,这在准备语句时是最有效的,另一部分需要快速连续的许多连接.由于pgBouncer不允许在session poolingtransaction pooling之间来回切换,我们不得不在不同的端口上运行两个单独的实例来支持我们的需求,或者实现this patch.初步测试表明它运行良好,但时间会证明它是否安全有效.

Postgresql相关问答推荐

如何在postquist中修剪第一/后文件名

"错误:无法创建用户:错误:关系\users\违反了非空约束

到第二天的Postgres计时器

为MCV扩展统计设置统计目标

Postgres 生成的列不是不可变的

未更改表上的 Postgres 环绕预防

为什么我使用 VBA 只能从 postgres 获得 10 行?

使用包含重复元素的数组 Select 重复值

是否可以使用 pgAdmin4 自动格式化/美化 SQL 查询?

Docker - 判断 postgres 是否准备好

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

在 Postgresql 中获取星期几

postgresql 在查询中插入空值

Rails 4 迁移: has_and_belongs_to_many table name

在 row_to_json 函数中 Select 查询

如何在 PostgreSQL 中插入多行

使用 pg_dump 和 psql -U postgres db_name < ... 移动数据库会导致ERROR: relation "table_name" does not exist

如何为 postgres 连接设置 application_name?

如果 PostgreSQL count(*) 总是很慢,如何对复杂查询进行分页?

如何将 PostgreSQL 查询输出导出到 csv 文件