2015-06-03 55 views
0

我有一個數據庫獲取調用彈簧jdbcTemplate和行取得大約100萬。迭代結果集需要花費太多時間。在調試行爲後,我發現它像批處理一樣處理一些行,然後等待一段時間,然後再次處理一批行並處理它們。看起來行處理不是連續的,所以總體時間進入分鐘。我已經使用數據源的默認配置。請幫忙。春季JDBC模板ROW映射器太慢

[編輯]

下面是一些示例代碼

this.prestoJdbcTempate.query(query, new RowMapper<SomeObject>() { 
      @Override 
      public SomeObject mapRow(final ResultSet rs, final int rowNum) throws SQLException { 

       System.out.println(rowNum); 
       SomeObject obj = new SomeObject(); 
       obj.setProp1(rs.getString(1)); 
       obj.setProp2(rs.getString(2)); 
       .... 
       obj.setProp8(rs.getString(8)); 
       return obj; 
      } 
    }); 
+3

這需要時間來在網絡上移動一個百萬行。您看到的「批處理」實際上是驅動程序通過網絡向其自己的緩衝區請求更多行。由於網絡開銷,連續執行它是沒有意義的。 無論如何映射一百萬行的想法是什麼?你是否同時需要內存中的所有對象?同時顯示你的代碼。 – Kayaman

+1

僅使用前向結果集。這對於獲取這些數百萬行很有用。還要將模式設置爲只讀。 –

+0

@Kayaman我需要在UI上顯示結果,所以我需要同時在內存中的所有對象,也現在給出示例代碼 –

回答

2

由於大部分的意見告訴你,一個mllion記錄是無用的,不現實的顯示在任何用戶界面 - 如果這是一個真正的業務需求,你需要教育你的客戶。

網絡流量應用程序和數據庫服務器是此類場景中性能的關鍵因素。有一個可選的參數,可以真正幫助您在這個場景:獲取大小 - 這也一定程度上

例子:

Connection connection = //get your connection 
Statement statement = connection.createStatement(); 
statement.setFetchSize(1000); // configure the fetch size 

大部分的JDBC數據庫驅動程序有一個低的獲取大小默認和調整這可以幫助你在這種情況下。 **但要小心以下的**。

  • 確保您的JDBC驅動程序支持獲取大小
  • 確保您的JVM堆設置(-Xmx)是足夠寬處理,因爲這樣的結果創建的對象。
  • 最後,只選擇需要減少網絡開銷的列。

在春天,JdbcTemplate讓你設置fetchSize