我目前正在增强一个使用 spring 和 hibernate 的应用程序。有多个实例,应用程序通过准备好的语句与 db (postgres) 通信。到目前为止,该应用程序通过 dbcp 与 postgres 通信。
更改:应用程序现在通过 pgbouncer 与 postgres 通信。
即:应用程序-> dbcp-> pgbouncer-> postgres
我知道这不是最理想的解决方案,即:拥有 2 个池。但是由于当前的架构,我们需要它们两者。
要求:pgbouncer 不支持事务模式下的准备好的语句,因此必须被淘汰。
更改以消除准备好的语句。
1) psql: 版本 = 9.2.6
没变
2)pgbouncer:在配置文件中设置以下属性
ignore_startup_parameters=extra_float_digits
pool_mode=transaction
server_reset_query=
3) jdbc : 准备好的阈值已相应设置。IE :jdbc:postgresql://localhost:6541/postgres?prepareThreshold=0
JAVA VERSION = 1.7.0_51
JDBC DRIVER = postgresql-9.3-1102.jdbc41-3.jar
4) dbcp : poolPreparedStatements = false maxOpenPreparedStatements = 0
5)休眠:没有变化
6)弹簧:没有变化
问题:
尽管发生了所有这些变化,我仍然看到准备好的语句试图创建并且交易因此而失败。
“错误:准备好的语句“S_21”不存在;嵌套异常是 org.postgresql.util.PSQLException:错误:准备好的语句“S_21”不存在”
我已经删除了所有使用准备好的语句的逻辑更改。
如何防止创建其他准备好的语句?spring 或 hibernate 是否在内部为其使用创建准备好的语句?如果是,我该如何禁用它们?