При выполнении пакетных запросов через 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:
Я наткнулся на эту ссылку, где плакат перевернул собственный патч. В настоящее время мы изучаем его применение для наших собственных целей, если оно окажется безопасным и эффективным.