2013-07-19 26 views
14
while(result_set.next()) 
{ 
    ... 
} 

我已經使用System.nanoTime()並計算時間,每次迭代所花費的時間以毫秒爲單位,但整個循環大約需要16秒。我正在考慮一個可能的原因,即條件測試需要花費很多時間,即next()函數。使用JDBC for Oracle對ResultSet進行迭代需要大約16秒的時間?

僅供參考如果我連接到遠程數據庫服務器,並且使用上述方法再次計算出的選擇查詢以毫秒爲單位完成。 關於爲什麼會發生這種情況的任何原因,以及我如何能夠將結果集迭代到最大一秒?

編輯:

我處理約4000條記錄每條記錄,則爲每個大小的約10個字符

EDIT2 感謝的setFetchSize()約10列做的魔力,真棒,真棒

+1

您認爲您有多少條記錄? –

+1

結果集包含多少條記錄?此外,瞭解是否提供了while循環的整個代碼將會很有幫助。 – Mubin

+0

要麼你有很多記錄,要麼你的網絡很慢。這裏不要責怪JDBC。 – Kayaman

回答

22

嘗試更改ResultSet獲取大小。默認情況下,Oracle JDBC驅動程序每次從數據庫遊標接收結果集只有10行。它可能不會顯着提高性能,但沒有其他許多選項可以使驅動程序更快地工作。

+1

'我不認爲這會顯着提高性能 - - 好吧,它確實:-)看到我的答案在下面。無論如何+1正確和良好的答案 –

+0

@Andreas很酷,+1,固定我的答案 –

28

我已經設置了一個表,4000行和10列,用10個字符的每個,並使用以下方法制成的簡單的性能試驗(RealTimeCounter是測量start()stop()之間的實時類):

List<String> myResult = new ArrayList<>(); 
ResultSet rs = s.executeQuery("SELECT * FROM Performance"); 

RealTimeCounter rtc = new RealTimeCounter(); 
rtc.start(); 
while(rs.next()) { 
    myResult.add(rs.getString(1)); 
} 
rtc.stop(); 
System.out.println(rtc); 

結果:

  • 默認提取大小:執行時間約爲20秒
  • 提取大小= 100:執行時間約爲2.2秒
  • 提取大小= 500:執行時間約爲450毫秒
  • 提取大小= 2000:執行時間約爲120毫秒
  • 提取大小= 4000:執行時間約爲50毫秒
  • 提取大小= 4001:執行時間約爲10毫秒(!!)

因此,獲取大小確實對執行速度顯著影響。


請注意,另一方面,提取大小對內存消耗有一定影響。有趣的是,在上述代碼前後使用Runtime.getRuntime().freeMemory();進行的快速分析表明,這種影響比我預期的要小得多。我得到的數字是:

  • 默認獲取大小:665K
  • 獲取大小= 100:665K
  • 獲取大小= 500:665K
  • 獲取大小= 2000:743K
  • 獲取大小= 4000:821k
  • 獲取大小= 4001:861k
+2

偉大analyisis – hershey92

+0

值得一提的是,雖然增加抓取大小通常提高執行速度,它也會導致您的程序使用更多的內存 - 你最終制作權衡。這裏沒有免費午餐。 –

+0

@JohnRoberts好點 - 有趣的是,對內存消耗的一個快速和骯髒的分析表明,這種影響比我預期的要少得多,儘管...... –

相關問題