2011-10-06 79 views
3

在我的java代碼中,我使用select語句訪問oracle數據庫表。 我收到很多行(約50.000行),所以rs.next()需要一些時間來處理所有行。CachedRowSet比ResultSet慢嗎?

using ResultSet, the processing of all rows (rs.next) takes about 30 secs 

我的目標是加快這個過程,所以我改變了代碼,現在使用CachedRowSet

using CachedRowSet, the processing of all rows takes about 35 secs 

我不明白爲什麼CachedRowSet比正常ResultSet慢,因爲CachedRowSet一次檢索所有數據,而ResultSet每次調用rs.next時檢索數據。

下面是代碼的一部分:

try { 
    stmt = masterCon.prepareStatement(sql); 
    rs = stmt.executeQuery(); 

    CachedRowSet crset = new CachedRowSetImpl(); 
    crset.populate(rs); 

    while (rs.next()) { 
     int countStar = iterRs.getInt("COUNT"); 
     ... 
    } 
} finally { 
    //cleanup 
} 
+0

即使CachedRowSet同時檢索所有數據,也需要時間返回該數據 - 原始SQL查詢從Oracle控制檯上獨立運行多久? –

回答

3

是什麼讓你認爲ResultSet每次都會rs.next()檢索數據被稱爲?這取決於它的工作原理 - 如果它一次獲取塊,我不會感到驚訝;很可能是一個相當大的塊。

我懷疑你基本上看它需要複製所有數據的時間到CachedRowSet然後訪問這一切 - 基本上你有沒有爲目的的額外的複製操作。

3

CachedRowSet與postgres jdbc驅動程序結合在一起時出現問題。

CachedRowSet需要知道列的類型,以便知道要創建哪個java對象 (上帝知道還有什麼它從封面後面的數據庫中獲取!)。

因此,它爲數據庫提供更多的往返行以獲取列元數據。 數量很大時,這成爲一個真正的問題。 如果數據庫位於遠程服務器上,由於網絡延遲問題,這也是一個真正的問題。

多年來我們一直在使用CachedRowSet,並剛剛發現了這一點。我們現在執行我們自己的CachedRowSet,因爲我們從來沒有使用任何它的花哨的東西。 我們爲所有類型做getString並轉換自己,因爲這似乎是最快捷的方式。

由於postgres驅動程序默認獲取所有內容,所以這顯然不是提取大小的問題。

0

使用普通的ResultSet,您可以通過RowPrefetch和FetchSize獲得更多優化選項。

那些在while循環中優化網絡傳輸塊和處理,所以rs.next()總是有一個數據來處理。

FetchSize的默認設置爲10(Oracle最新版本),但據我所知RowPrefetch沒有設置。因此意味着網絡傳輸沒有得到優化。