我目前正在增强一个使用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是否在内部为其使用创建了准备好的语句?如果是,我该如何禁用它们?
答案 0 :(得分:0)
以下配置ia在我的系统上运行时没有任何 ERROR:预编译语句“S_21”不存在; 错误。希望它有所帮助:
在Hibernate 4.x中禁用Prepared语句
<property name="hibernate.cache.use_query_cache">false</property>
答案 1 :(得分:0)
我知道这篇文章是几年前的,但我仍然面临着同样的问题。不幸的是,建议的更改不适用于当前的用例。
面对以下问题: -“错误:预准备语句xxx不存在” -“错误:准备好的语句xxx已经存在”
尝试按照建议的更改进行操作,但仍然出现相同的错误:
技术栈:
@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)