我目前正在增强一个使用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是否在内部创建准备使用的语句?如果是,如何禁用它们?
以下配置在我的系统上正常运行,没有任何错误:预处理语句“ S_21”不存在;错误。希望对您有所帮助:
在Hibernate 4.x中禁用准备好的语句
<property name="hibernate.cache.use_query_cache">false</property>
我知道这篇文章是几年前的,但我仍然面临着同样的问题。不幸的是,建议的更改不适用于当前的用例。
面对以下问题:-“错误:预准备语句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)