8

我目前正在增强一个使用 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 是否在内部为其使用创建准备好的语句?如果是,我该如何禁用它们?

4

2 回答 2

1

我知道这篇文章是几年前的,但我仍然面临同样的问题。不幸的是,建议的更改不适用于我当前的用例。

面临以下问题:-“错误:准备好的语句 xxx 不存在”-“错误:准备好的语句 xxx 已存在”

按照建议的更改进行了尝试,但仍然出现相同的错误:

技术栈:

  • Spring Boot (2.1.7.RELEASE)
  • Spring Data(JPA + Hibernate)
  • 该应用程序使用 Heroku Postgre 部署在 Heorku 上
  • 客户端 PgBouncer。
  • 使用以下属性修改了 DB url:“?sslmode=disable&prepareThreshold=0&preparedStatementCacheQueries=0”
  • Heroku 配置中添加了以下设置:
    • PGSSLMODE=禁用
    • PGBOUNCER_POOL_MODE = 交易
    • PGBOUNCER_IGNORE_STARTUP_PARAMETERS = extra_float_digits
    • 将 PGBOUNCER_URLS 配置值设置为数据库名称 Urls
  • Spring Data 设置为使用两个数据库进行(读/写和读)。
  • 将 @Transactional(readOnly=true) 与@Around("@annotation(transactional)") public Object proceed(ProceedingJoinPoint proceedingJoinPoint, Transactional transactional) throws Throwable { try { if(transactional.readOnly()) { RoutingDataSource.setReplicaRoute(); LOGGER.info("Routing database call to the read replica"); } return proceedingJoinPoint.proceed(); } finally { RoutingDataSource.clearReplicaRoute(); } }
于 2019-10-30T17:42:04.340 回答
0

以下配置在我的系统上运行而没有任何错误:准备好的语句“S_21”不存在;错误。希望能帮助到你:

  1. pgBouncer 1.6.1,pool_mode = 交易
  2. 添加到 Hibernate db-connection 字符串:prepareThreshold=0
  3. Postgresql-JDBC 9.4-1203-jdbc41 驱动
  4. 在 Hibernate 4.x 中禁用准备好的语句

    <property name="hibernate.cache.use_query_cache">false</property>
    
于 2015-10-14T08:49:09.490 回答