【问题标题】:java.Statement.executeQuery() creates a prepared statement when it should notjava.Statement.executeQuery() 在不应该创建准备好的语句时
【发布时间】:2017-01-17 21:11:51
【问题描述】:

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

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;

这是我期望在生产服务器上看到的。

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


一些背景:

  • Mirth 3.4.1,连接到 Postgres 9.5
  • 我的测试用例位于数据库阅读器通道中,并勾选了“使用 Javascript”。
  • 但是,从日志来看,似乎每个查询都被解析/绑定/执行。甚至是 Mirth 提出的内部查询。

【问题讨论】:

  • 这可能是日志级别设置的差异
  • 您的意思是说它实际上并没有创建准备好的语句,而是简单的日志级别设置提供了更详细的输出?如果是这样的话,我不会运行“SELECT a, b, c FROM foo;”吗?从 postgres 命令行在日志中给出相同的输出?它没有。
  • 嘿,这可能是答案(我明天需要检查一下):stackoverflow.com/questions/6741530/…

标签: javascript java postgresql mirth


【解决方案1】:

是的,PostgreSQL JDBC 驱动程序使用扩展协议(解析/绑定/执行),除非您强制使用协议版本 2。

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

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

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多