2012-12-19 18 views
8

假設有一個ResultSet rsn對象的速度,同時(rs.next())。比一系列rs.absolute的()

此代碼:

while(rs.next()) { 
    // do something on rs 
} 

是algoritmically等於該代碼(即既給出了相同的結果):

for(i=1; i<=n; i++) { 
    rs.absolute(i) 
    // do something on rs 
} 

但此equivalant上throughouts方面?第一個更快?或者,對於給定的i,rs.next()只是rs.absolute(i+1)的包裝?

問候 MC

+1

什麼阻止你自己測試它?最有可能的是,這種差異是可以忽略的,所以應該使用更容易閱讀的代碼。 –

+1

@KlasLindbäck編寫一個正確的微基準是令人驚訝的[平凡](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java)。 –

+2

使用'rs.next()',您無需事先知道結果集大小,只需使用'rs.absolute()'。這意味着事先進行第二次查詢。 – BalusC

回答

6

rs.next需要一個更簡單的一種數據庫光標(FORWARD_ONLY)比rs.absolute的,所以在大多數情況下,你會降低性能/資源效率rs.absolute。在某些情況下,無論如何都不會對光標進行優化,您可能會獲得相同的性能。

某些驅動程序可能允許absolute調用即使與FORWARD_ONLY,驗證所請求的記錄是下一個,但其他人可能會拋出異常,無論如何。

+0

所以,如果我宣佈我的PreparedStatement爲prepareStatement(SQL,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);這兩個代碼塊是絕對相等的。對? –

+0

這在一般情況下不能回答,因爲這些都只是給駕駛員提示。真正有差異的可能性較小,但我相信也有反例。 –

+0

@Mariano無法確認,因爲它將強烈依賴驅動程序的實現和底層數據庫的行爲。一般來說,我會說:如果你想依次通過一個ResultSet,使用'rs.next()',但這只是一個直覺 –

2

前者rs.next()可能會更快,雖然這取決於底層實現,並在現實中,你可能會得到同樣的性能,由於內部優化。

驅動程序在執行rs.absolute()時可能沒有考慮當前位置,所以它可能會稍微有一點點的開銷,而在rs.next()它只能前進。

所以如果你需要遍歷所有的結果,只需使用rs.next(),如果你需要跳到一個特定的結果使用rs.absolute()

請記住,結果集實際上通常是由數據庫遠程處理的(除非它的CachedResultSet),所以來回可能會涉及比您想象的更多的開銷。