我們正在運行java6/hibernate/c3p0/postgresql堆棧。 我們的JDBC驅動程序是8.4-701.jdbc3我應該激活c3p0語句池嗎?
我對準備語句有幾個問題。我已閱讀 優秀文檔約Prepared Statements
但我仍然有一個問題,如何配置PostgreSQL的c3p0。
目前,我們有
c3p0.maxStatements = 0
c3p0.maxStatementsPerConnection = 0
在我的理解中準備的語句和語句池是兩個不同的東西:
我們休眠堆棧使用準備好的語句。 Postgresql緩存 執行計劃。下一次使用相同的語句時,postgresql會重用 執行計劃。這可以節省DB中的時間計劃語句。
此外,c3p0可以緩存「java.sql.PreparedStatement」 的java實例,這意味着它正在緩存java對象。所以當使用
c3p0.maxStatementsPerConnection = 100時,它會緩存至多100個不同的對象的
對象。它節省了創建對象的時間,但這與postgresql數據庫及其準備的語句無關 。
,對嗎?
當我們使用約100個不同的語句我會成立 c3p0.maxStatementsPerConnection = 100
但C3P0文檔說在c3p0 known shortcomings
語句池的開銷 太高。對於不支持 的驅動程序,執行 PreparedStatements的重要預處理,共用 開銷超過了任何節省。 默認情況下,語句池關閉爲 。如果您的驅動程序執行 預處理PreparedStatements, ,特別是如果它通過具有 RDBMS的IPC執行,您可能會看到 明顯的性能增益, 將語句池合併。 (通過將配置屬性 maxStatements或 maxStatementsPerConnection設置爲大於零的值 來執行此操作 )。
所以:用c3p0和Postgresql激活maxStatementsPerConnection是否合理? 激活它有沒有真正的好處?
親切的問候 Janning
偉大的答案!有了你的詳細解釋,我可以進行一些測試。事實上:激活c3p0語句池是合理的。 之前,我的語句每次解析和計劃,現在他們只能綁定和執行。 但請注意您的數據是否改變以及舊計劃的執行效果不佳。我還不知道postgresql是否會不時重複準備好的語句。 非常感謝你的幫助! – Janning 2010-05-28 19:50:23
很棒的回答!實際上,我總是對PreparedStatement的實現感到困惑,並且懷疑每個人都告訴我的好處。 – Chao 2016-07-31 18:06:16