在dbcp + spring + hibernate + jdbc中禁用预准备语句?

jay*_*h88 6 spring hibernate jdbc prepared-statement pgbouncer

我目前正在增强一个使用spring和hibernate的应用程序.有多个实例,应用程序通过预准备语句与db(postgres)进行通信.应用程序到现在为止,通过dbcp与postgres通信.

更改:应用程序现在通过pgbouncer传达给postgres.

即:应用程序 - > dbcp - > pgbouncer - > postgres

我知道这不是最理想的解决方案,即:有两个普通人.但由于目前的架构,我们需要它们.

要求:pgbouncer不支持事务模式中的预准备语句,因此必须将其删除.

更改以消除准备好的声明.

1)psql:VERSION = 9.2.6

没变

2)pgbouncer:在配置文件中设置以下属性

  ignore_startup_parameters=extra_float_digits
  pool_mode=transaction
  server_reset_query=
Run Code Online (Sandbox Code Playgroud)

3)jdbc:已相应地设置准备的阈值.即:jdbc:postgresql://localhost:6541/postgres?prepareThreshold=0

 JAVA VERSION = 1.7.0_51

 JDBC DRIVER  = postgresql-9.3-1102.jdbc41-3.jar
Run Code Online (Sandbox Code Playgroud)

4)dbcp:poolPreparedStatements = false maxOpenPreparedStatements = 0

5)休眠:没有变化

6)春天:没有变化

问题:

尽管所有这些变化,我仍然看到准备好的陈述试图创建和交易失败的原因.

"错误:预处理语句"S_21"不存在;嵌套异常是org.postgresql.util.PSQLException:错误:预处理语句"S_21"不存在"

我删除了使用预准备语句的所有逻辑更改.

如何防止创建其他预准备语句?spring或hibernate是否在内部为其使用创建了准备好的语句?如果是,我该如何禁用它们?

Ven*_*kat 1

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

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

尝试按照建议的更改但仍然收到相同的错误:

技术堆栈:

  • Spring Boot(2.1.7.RELEASE)
  • Spring 数据(JPA + Hibernate)
  • 该应用程序使用 Heroku Postgre 部署在 Heorku 上
  • 客户端 PgBouncer。
  • 使用以下属性修改了数据库 URL:“?sslmode=disable&prepareThreshold=0&preparedStatementCacheQueries=0”
  • 以下设置已添加到 Heroku 配置中:
    • PGSSLMODE=禁用
    • PGBOUNCER_POOL_MODE = 交易
    • PGBOUNCER_IGNORE_STARTUP_PARAMETERS = extra_float_digits
    • 将 PGBOUNCER_URLS 配置值设置为数据库名称 URL
  • 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(); } }