java.Statement.executeQuery() 在不应该的时候创建准备好的语句

java.Statement.executeQuery() creates a prepared statement when it should not

我有很多看起来像这样的代码:

conn.createStatement().executeQuery("SELECT a, b, c FROM foo;");

在我的 postgres 日志中,我看到了很多这样的行:

parse <unnamed>: SELECT a, b, c FROM foo;
bind <unnamed>: SELECT a, b, c FROM foo;
execute <unnamed>: SELECT a, b, c FROM foo;

这是在生产服务器上。

在我的测试服务器上,我看到:

execute <unnamed>: SELECT a, b, c FROM foo;

这是我希望在生产服务器上看到的内容。

为什么它要为我的简单 select 查询创建准备好的语句?


一些背景:

是的,PostgreSQL JDBC 驱动程序使用扩展协议 (parse/bind/execute),除非您强制协议版本 2。

通常性能影响很小,因为协议消息往往来自单个网络数据包,应该不是问题。

我会三思而后行,在强制协议版本 2 之前好好测试并基准测试性能差异。这个旧协议版本没有得到很好的支持,并且已经开始闻起来很奇怪了。已认真考虑取消对它的支持(最近的讨论见 this message)。