2012-06-11 50 views
5

如果我一次只使用一個Statement,那麼將它與我的Connection一起緩存是值得的。我已經緩存了連接,所以我幾乎可以毫不費力地緩存語句。聲明的成本是多少

本質上,我想我是問是否有任何成本/開銷創建一個聲明。我完全理解創建預準備語句的好處。我在此專門討論Connection.createStatement()

+2

我總是會假設有一個開銷,但我總是會認爲開銷不值得爲應用程序增加複雜性,除非您有一個指示它是需要的性能改進的度量。 –

+0

這將是:如果我的應用程序正在創建數百萬條語句,那麼是的,否則不...... – Nik

回答

0

對開源jdbc驅動程序(jtds)的一些研究表明,爲創建的每個Statement創建以下對象開銷。我試圖創建計數我想查詢數據庫的新Statement每一次,而不是抱着一個單一的一個緩存和重用它的成本:

  1. 一個Connection - 想必緩存那麼微不足道。
  2. A TdsCore - 看起來像一個協議實現,但它被緩存得如此微不足道。
  3. A ResultSet
  4. 配料項目的ArrayList
  5. ResultSet s的ArrayList s。
  6. 列元數據。

因此,它看起來像Statement的成本的最高比例涉及任何已運行的查詢留下的東西。

4

聲明的成本無法獨立於其他因素量化;例如數據庫,JDBC驅動程序,語句中的SQL等等。

您可以確定在創建語句(或PreparedStatement)並首次執行時會有開銷。但是,這對於整體應用程序的性能來說並不重要。如果不是這樣,那麼實現緩存代碼只會浪費精力。

你不應該猜測這是否(或不)是一個有價值的優化。 應該做什麼是讓你的程序工作,然後分析它,然後使用分析數據來確定需要優化的東西。如果花費大量時間執行相同的查詢,那麼可能是緩存將有所幫助,也可能不會。試試看看它是否會對性能產生顯着影響。

+0

衆所周知,緩存'連接'是個好主意。因此,我會始終緩存'連接'而不浪費時間收集指標。我只是希望在陳述方面有類似的看法。 – OldCurmudgeon

+0

如果有必要,緩存連接只是一個好主意。如果沒有必要,你只是通過實現它浪費了開發人員的時間。恰巧有標準的連接池庫,如果你不必要地使用它們,你不會浪費很多時間。但我的觀點是,你不應該浪費時間優化...或者尋找優化技術......如果沒有證據表明這是必要的。而對於語句緩存,你沒有任何一般的證據,我懷疑它存在。 –