2017-06-28 14 views
-1

spring jdbcテンプレートを使用してデータを取得しようとしています。 テーブルには何百万ものレコードがあります。spring jdbcテンプレートを使用して何百万ものレコードを持つテーブルからデータを取得する方法

以下のコードを使用して無限の時間を費やし、最後にコードを停止します。

private static final String CLIENTDATA_QUERY = "select logtime, clientip, clientagent, uri from client_data"; 
public List<ClientDataModel> readFromClientDataDB() { 
//  jdbcTemplate.setFetchSize(1000); 
     List<ClientDataModel> clientData = jdbcTemplate.query(CLIENTDATA_QUERY, new RowMapper<ClientDataModel>() { 

      @Override 
      public ClientDataModel mapRow(ResultSet rs, int rowNum) throws SQLException { 
       ClientDataModel model = new ClientDataModel(); 
       model.setLogtime(rs.getString("logtime")); 
       model.setClientIP(rs.getString("clientip")); 
       model.setClientAgent(rs.getString("clientagent")); 
//    model.setUri(rs.getString("uri")); 
       return model; 
      } 
     }); 

     System.out.println("Client Data Size :" + clientData.size()); 
     return clientData; 
    } 

誰かが、最も効率的な方法で巨大なテーブルからレコードを取得する方法を提案できますか?

すべてのレコードを取得する必要があり、さらにロジックのコードが開始されます。これはサーバー側です。

+0

ページネート、ページネート、ページネート!カーソルを使用してください。 –

+0

@FedericoPeraltaSchaffnerカーソルの意味をお聞かせください。可能であれば、例を挙げることもできますか?ありがとう –

+0

レコードページをページ単位で処理できませんか?なぜあなたはまずテーブル全体をメモリに読み込む必要がありますか? –

答えて

1

代わりにリストを返すメソッドを使用しないでください。RowCallBackHandler.クエリではページネーションを使用することもできます。

JDBCTemplateは、データベースから取得したすべてのデータをオブジェクトの形式で読み込む必要があり、大きな結果セットを保持するために多くのメモリを消費します。このようなシナリオでは、Spring Batchが優れたソリューションです。

+1

[RowCallBackHandler](http://docs.spring .i/autorepo/docs/spring/4.0.0.M1/javadoc-api/org/springframework/jdbc/core/RowCallbackHandler.html)は、java.lang.OutOfMemoryErrorを与えています:GCオーバーヘッドの上限を超えています –

関連する問題