2011-01-19 59 views
4

哪種緩存策略速度更快,速度更快?每個連接緩存PreparedStatement還是讓連接池處理它?

1)PreparedStatement池(由連接池)。沒有應用程序緩存。

for (int i=0; i<1000; i++) { 
    PreparedStatement preparedStatement = connection.prepareStatement(sql); 
    preparedStatement.setObject(1, someValue); 
    preparedStatement.executeQuery(); 
    preparedStatement.close(); 
} 

2)應用程序級緩存。沒有PreparedStatement池。

PreparedStatement preparedStatement = connection.prepareStatement(sql); 
for (int i=0; i<1000; i++) { 
    preparedStatement.clearParameters(); 
    preparedStatement.setObject(1, someValue); 
    preparedStatement.executeQuery(); 
} 
preparedStatement.close(); 

這個問題類似於Reusing a PreparedStatement multiple times除了我期待具體的基準測試結果以及採取的PreparedStatement集中考慮。

http://drupal.org/node/550124#comment-2224630似乎表明應用程序級緩存比PreparedStatement池更有效,但差異可以忽略不計。我想在下定決心之前看到更多的基準。

回答

1

這種微基準很少引出任何有用的數據。真實世界的使用情況將因使用模式,底層數據庫實現,網絡,數據庫服務器上的內存以及其他內容而異。

爲什麼不直接編寫代碼以便它能夠正常運行,並進行測試。然後,如果它證明速度太慢,您可以更新實施並確保該軟件將繼續工作。

+0

我想了解是否值得在框架中引入應用程序級緩存。這會影響用戶羣,因此針對特定用例進行優化並不會真正起到幫助作用。是否有一些我們可以修改的備受尊敬的數據庫基準測試? – Gili 2011-01-19 16:42:22

+0

那麼,有沒有用戶請求這個功能?如果沒有,那麼也許沒有人需要它,你可以節省一些努力,而不是實現一個可能做得不多的新功能......只是一個念頭! – time4tea 2011-01-19 19:44:22

-3

應用程序級緩存會更有效率,特別是如果您批量執行。

即使使用連接池,每次連接準備就緒(後退和第四次)以及每次關閉所需的網絡開銷也會使其不僅更慢,而且會增加SQL服務器和客戶端上的CPU級別開銷服務器。