2012-08-27 69 views
10

我正在使用例如c3p0與一些已定義的「maxStatements」進行preparedStatement緩存。 這個緩存究竟做了什麼?它緩存什麼樣的數據。在什麼級別(db,application,..)? 從例子中可以很好地理解它。例如,我有一個查詢PreparedStatement緩存 - 它是什麼意思(它是如何工作的)

select * from sometable wherecolumn =?

現在我將它發送到未緩存的準備好的語句中。 現在我發送它,它被緩存。 有什麼區別。第一種情況和第二種情況發生了什麼?在第一種情況下和第二種情況下發送到數據庫服務器的是什麼?

謝謝。

回答

9

如果沒有緩存,每次從Connection請求時都會得到一個新的PreparedStatement。通過緩存,如果您提供相同的SQL字符串,您將經常獲得完全相同的PreparedStatement類型的Java對象。如果您向PreparedStatement提供相同的SQL,即使使用不同的參數,數據庫通常也可以重用像執行計劃這樣的信息,但前提是您繼續使用相同的PreparedStatement。通過不需要您的應用程序繼續執行該PreparedStatement引用本身,緩存可以更輕鬆地進行操作。

8

約翰瓦茨的答案非常好。

請注意,沒有示例代碼可以提供,因爲語句高速緩存是透明的:使用它的代碼看起來完全像代碼不一樣。您只需通過將maxStatements和/或maxStatementsPerConnection設置爲正值來在c3p0中打開語句緩存。

語句高速緩存的任何性能優勢都依賴於數據庫/ JDBC驅動程序。要查看語句緩存是否有幫助,請嘗試首先使用語句緩存關閉應用程序,然後將maxStatementsPerConnection設置爲您的應用程序重複使用的準備語句查詢數。對於某些應用程序/數據庫/驅動程序,您會看到顯着的優勢。對於其他人你不會看到任何物質利益。

+0

有什麼經驗法則嗎?我的應用程序按順序執行大約100個不同的sqls,因此我猜測用PreparedStatement池等於50的命中率將爲0(LRU?)。 – j23

+1

要做的最簡單的事情就是使用'maxStatementsPerConnection'並將其設置爲您的應用程序經常使用的PreparedStatements的數量。 (即忽略用於應用程序初始化的語句,或者更少用於管理目的的語句等),如果您的應用程序始終順序執行100個不同的PreparedStatements,那麼當然,請嘗試將'maxStatementsPerConnection'設置爲100,但存在風險那個內存和資源佔用將超過任何好處,你會變得更好。你必須看到。 –

相關問題