gpt4 book ai didi

针对 PPGool II 的 Java 查询导致 "unnamed prepared statement does not exist"错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:44 28 4
gpt4 key购买 nike

我有一个使用 Postgres 数据库的 Java 应用程序,我正在尝试引入 PPGool 以扩展我的数据库。我遇到了 Postgres 抛出以下错误的问题:未命名的准备语句不存在。在启动 Postgres 上的日志记录后,我看到我的应用程序执行的每个选择语句都发生了以下情况:

EDTLOG:  00000: duration: 7.585 ms  parse <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 0.088 ms bind <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 79.014 ms execute <unnamed>: "my select statement here"

但有时,在解析/绑定(bind)/执行步骤之间,PGPool 会执行一些额外的查询,因此日志如下所示:

EDTLOG:  00000: duration: 7.585 ms  parse <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 0.088 ms bind <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 0.328 ms statement: SELECT count(*) FROM pg_class AS c, pg_namespace AS n WHERE c.relname = 'my_table' AND c.relnamespace = n.oid AND n.nspname = 'pg_catalog'
EDTLOG: 00000: duration: 79.014 ms execute <unnamed>: "my select statement here"
EDTERROR: 26000: unnamed prepared statement does not exist
EDTLOG: 00000: duration: 0.022 ms parse S_2: ROLLBACK
EDTLOG: 00000: duration: 0.005 ms bind S_2: ROLLBACK
EDTLOG: 00000: duration: 0.008 ms execute S_2: ROLLBACK

据我所知,因为查询是未命名的,如果在执行未命名查询之前在该数据库 session 期间出现另一个查询,它会被 Postgres 丢弃。因此,由于 PGPool 有时会在解析/绑定(bind)/执行步骤之间发出这些额外的查询,这会导致查询被丢弃。

我的第一个想法是,也许我的 Java 应用程序不需要为每个查询发送解析/绑定(bind)/执行语句。但看起来这是自 JDBC 版本 3 和 Postgres 7.4 以来 Postgres JDBC 驱动程序的默认行为 http://jdbc.postgresql.org/documentation/head/server-prepare.html .我想我可以尝试完全禁用服务器端准备好的语句,但文档没有具体说明如何做到这一点,而且我不确定这是否是我想要做的事情。

我的第二个想法是让 PGPool II 停止发送那些元数据查询。由于我只是想将 PGPool 用作负载平衡器,所以我真的不明白为什么它需要了解我的表元数据的所有信息。我在此处的 PPGool 源的 is_system_catalog 方法中追踪了执行这些查询的代码:https://github.com/iakio/pgpool-II/blob/master/pool_select_walker.c#L256似乎 PGPool 出于某种原因想要了解我的表关系,不幸的是我没有看到任何禁用该行为的方法。

任何有关如何解决此问题的见解都将不胜感激。

关于我的环境的一些信息:

JDBC Driver: postgresql-9.1-901.jdbc4.jar
Java version "1.6.0_31"
Spring 3.1 managed JPA
Hibernate 3.5
Postgres 9.1

更新:我找到了解决该问题的方法。通过在 JDBC URL 中放置 protocolVersion=2,它基本上告诉 Postgres JDBC 驱动程序不要使用服务器端准备好的语句。这允许我的应用程序在我的数据库前使用 PGPool II 时运行。不过,我不得不回退到 JDBC 版本 2 协议(protocol)才能使用 PPGool,这让我很困扰。

最佳答案

我找到了解决该问题的方法。通过在 JDBC URL 中放置 protocolVersion=2 它基本上告诉 Postgres JDBC 驱动程序不要使用服务器端准备好的语句。这允许我的应用程序在我的数据库前使用 PGPool II 时运行。不过,我不得不回退到 JDBC 版本 2 协议(protocol)才能使用 PPGool,这让我很困扰。

关于针对 PPGool II 的 Java 查询导致 "unnamed prepared statement does not exist"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9725018/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com