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 查询创建准备好的语句?
一些背景:
- Mirth 3.4.1,连接到 Postgres 9.5
- 我的测试用例在数据库 Reader 频道中,"Use Javascript" 已勾选。
- 但是,从日志来看,似乎每个查询都是 parse/bind/executed。甚至 Mirth 提出的内部查询。
是的,PostgreSQL JDBC 驱动程序使用扩展协议 (parse/bind/execute),除非您强制协议版本 2。
通常性能影响很小,因为协议消息往往来自单个网络数据包,应该不是问题。
我会三思而后行,在强制协议版本 2 之前好好测试并基准测试性能差异。这个旧协议版本没有得到很好的支持,并且已经开始闻起来很奇怪了。已认真考虑取消对它的支持(最近的讨论见 this message)。
我有很多看起来像这样的代码:
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 查询创建准备好的语句?
一些背景:
- Mirth 3.4.1,连接到 Postgres 9.5
- 我的测试用例在数据库 Reader 频道中,"Use Javascript" 已勾选。
- 但是,从日志来看,似乎每个查询都是 parse/bind/executed。甚至 Mirth 提出的内部查询。
是的,PostgreSQL JDBC 驱动程序使用扩展协议 (parse/bind/execute),除非您强制协议版本 2。
通常性能影响很小,因为协议消息往往来自单个网络数据包,应该不是问题。
我会三思而后行,在强制协议版本 2 之前好好测试并基准测试性能差异。这个旧协议版本没有得到很好的支持,并且已经开始闻起来很奇怪了。已认真考虑取消对它的支持(最近的讨论见 this message)。