2017-06-28 3 views
-1

Ich versuche, Daten mit Spring jdbc Vorlage abzurufen. Die Tabelle hat Millionen von Datensätzen.So holen Sie Daten aus einer Tabelle mit Millionen von Datensätzen mithilfe von Spring jdbc Vorlage

Die Verwendung des unten stehenden Codes dauert unendlich lange und schließlich muss ich den Code nicht mehr ausführen.

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; 
    } 

Bitte kann jemand vorschlagen, wie ich Datensätze aus einer riesigen Tabelle auf die effizienteste Weise abrufen kann.

Alle Datensätze müssen abgerufen werden und dann beginnt der Code für die weitere Logik. Dies ist auf der Serverseite.

+0

Paginieren, paginieren, paginieren! Verwenden Sie einen Cursor usw. –

+0

@FedericoPeraltaSchaffner bitte können Sie vorschlagen, was Sie mit dem Cursor meinen. Können Sie auch ein Beispiel geben, wenn möglich. Danke –

+0

können Sie die Datensätze nicht Seite für Seite verarbeiten? Warum müssen Sie zuerst die gesamte Tabelle in den Speicher einlesen? –

Antwort

1

Verwenden Sie keine Methode, die eine Liste zurückgibt, verwenden Sie stattdessen RowCallBackHandler. Sie können in Ihrer Abfrage auch Paginierung verwenden.

JDBCTemplate erfordert das Einlesen aller Daten, die in Form eines Objekts aus der Datenbank abgerufen werden, da bei der Speicherung großer Ergebnismengen viel Speicherplatz belegt ist. Spring Batch ist eine bessere Lösung in solchen Szenarien.

+1

Auch mit einem [RowCallBackHandler] (http: //docs.spring .io/autorepo/docs/spring/4.0.0.M1/javadoc-api/org/springframework/jdbc/core/RowCallbackHandler.html) gibt mir java.lang.OutOfMemoryError: GC overhead limit überschritten –

Verwandte Themen