2017-12-22 8 views
0

Mein Prozess wie folgt aussieht:.jOOQ batchInsert() execute()

  1. einige Daten 50 Zeilen pro wählen wählen,

  2. do sth mit Daten (einige Werte)

  3. verwandeln Reihe zum Objekt der anderen Tabelle
  4. Anruf batchInsert (myListOfRecords) .Execute()

Mein Problem besteht darin, einzurichten, wann Daten eingefügt werden sollen. In meinem aktuellen Setup werden Daten nur am Ende meiner Schleife eingefügt. Dies ist eine Art von Problem für mich, weil ich viel mehr Daten verarbeiten möchte, als in meinen Tests. Wenn ich damit einverstanden bin, endet mein Prozess mit Ausnahme (OutOfMemory). Wo sollte ich maximale Menge von Daten in Batch definieren, um insert anzurufen?

Antwort

0

Wichtig ist, dass Sie nicht alle Zeilen, die Sie bearbeiten möchten, auf einmal abrufen können. Bei Verwendung von jOOQ erfolgt dies mit ResultQuery.fetchLazy() (möglicherweise zusammen mit ResultQuery.fetchSize(int)). Sie können dann die nächsten 50 Zeilen mit Cursor.fetchNext(50) abrufen und mit Ihrer Einfügung wie folgt fortfahren:

try (Cursor<?> cursor = ctx 
    .select(...) 
    .from(...) 
    .fetchSize(50) 
    .fetchLazy()) { 

    Result<?> batch; 

    for (;;) { 
     batch = cursor.fetchNext(50); 

     if (batch.isEmpty()) 
      break; 

     // Do your stuff here 

     // Do your insertion here 
     ctx.batchInsert(...); 
    } 
}