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

问题描述 投票:6回答:2

我目前正在增强一个使用spring和hibernate的应用程序。在多个实例中,该应用程序通过准备好的语句与db(postgres)通信。到目前为止,该应用程序已通过dbcp与postgres通信。

更改:现在,该应用程序通过pgbouncer与postgres通信。

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

我知道这不是最理想的解决方案,即:有2个池池。但是由于当前的体系结构,我们都需要它们。

要求:pgbouncer不支持transaction模式下的准备好的语句,因此必须删除。

更改以消除准备好的语句。

1)psql:版本= 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 = falsemaxOpenPreparedStatements = 0

5)休眠:无更改

6)弹簧:无变化

问题:

尽管进行了所有这些更改,我仍然看到尝试创建准备好的语句并且由于该原因事务失败。

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

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

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

spring hibernate jdbc prepared-statement pgbouncer
2个回答
0
投票

以下配置在我的系统上正常运行,没有任何错误:预处理语句“ S_21”不存在;错误。希望对您有所帮助:

  1. pgBouncer 1.6.1,pool_mode = transaction
  2. 已添加到Hibernate数据库连接字符串:prepareThreshold = 0
  3. Postgresql-JDBC 9.4-1203-jdbc41驱动程序
  4. 在Hibernate 4.x中禁用准备好的语句

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

0
投票

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

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

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

技术栈:

  • Spring Boot(2.1.7.RELEASE)
  • Spring数据(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)
© www.soinside.com 2019 - 2024. All rights reserved.