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是否在内部为其使用创建了准备好的语句?如果是,我该如何禁用它们?
我知道这篇文章是几年前的,但我仍然面临着同样的问题。不幸的是,建议的更改不适用于我当前的用例。
面临以下问题: - “错误:准备好的语句 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();
}
}| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |