2017-01-17 56 views
0

我有一大堆代碼,看起來像這樣準備好的語句:java.Statement.executeQuery()創建時,它不應該

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; 

這是我希望看到在生產服務器上。

爲什麼它試圖爲我的簡單選擇查詢創建一個準備好的語句?


一些背景資料:

  • 歡樂3.4.1,連接到Postgres的9.5
  • 我的測試案例是在同一個數據庫閱讀器頻道 「使用JavaScript」 勾掉。
  • 但是,從日誌看來,每個查詢都會被解析/綁定/執行。即使是Mirth所做的內部疑問。
+0

它可能是日誌級別設置的差異 – asit

+0

您是否建議它實際上並未創建預準備語句,但簡單日誌級別設置是否提供了更詳細的輸出?如果是這樣的話,我會不會跑「SELECT a,b,c FROM foo;」從postgres命令行在日誌中給出相同的輸出?它不是。 – Jason

+0

嘿,這可能是答案(我將需要明天檢查出來):http://stackoverflow.com/questions/6741530/any-way-to-not-use-server-side-prepared-statements-在-的PostgreSQL – Jason

回答

1

是,PostgreSQL JDBC驅動使用擴展協議(分析/結合/執行)除非強制協議版本2.

一般的性能影響很小作爲協議消息傾向於來在單個網絡包,它不應該是一個問題。

我想兩次,測試好,並在強制協議版本2之前對性能差異進行基準測試。這個舊協議版本沒有得到很好的支持,並開始聞起來很有趣。它已被認真考慮取消對它的支持(最近的討論見this message)。