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

时间:2015-02-13 23:39:10

标签: 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=

3)jdbc:已相应地设置准备好的阈值。          即: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)spring:无变化

问题:

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

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

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

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

2 个答案:

答案 0 :(得分:0)

以下配置ia在我的系统上运行时没有任何 ERROR:预编译语句“S_21”不存在; 错误。希望它有所帮助:

  1. pgBouncer 1.6.1,pool_mode = transaction
  2. 添加到Hibernate db-connection字符串:prepareThreshold = 0
  3. Postgresql-JDBC 9.4-1203-jdbc41 driver
  4. 在Hibernate 4.x中禁用Prepared语句

    <property name="hibernate.cache.use_query_cache">false</property>
    

答案 1 :(得分:0)

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

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

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

技术栈:

  • Spring Boot(2.1.7.RELEASE)
  • 春季数据(JPA +休眠)
  • 使用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配置值设置为数据库名称Urls
  • Spring数据被设置为使用两个数据库进行(读/写和读)。
  • @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(); } }中使用@Transactional(readOnly = true)