2016-06-16 10 views
0

In der folgenden Methode versuche ich eine Update-Abfrage als Batch auszuführen. Aber diese Methode hängt von Zeit zu Zeit, wenn es ausgeführt wird. Meine Annahme ist, dass es aus irgendeinem Grund eine DB-Tabellensperre für die sample_table erstellt und dann, wenn das executebatch erneut ausgeführt wird, wartet, bis die Sperre freigegeben wird. Schließlich den Prozess hängen.Der beste Weg zum Implementieren von Update-Abfragen als Batch mit execuebatch() ist innerhalb einer Schleife

Meine Fragen sind

  1. , ob dies der beste Weg ist es, eine Update-Abfrage für einen Batch ausführen zu implementieren?
  2. Sollte ich Autocommit nicht auf false setzen und dann nach jedem ps.executeBatch() innerhalb der Schleife festschreiben.
  3. Das ist leistungsfähiger, indem alle Chargen hinzugefügt werden und dann jede Charge immer wieder neu festgelegt oder übergeben wird.

Hinweis: Anzahl der Datensätze aktualisiert könnten bis zu 9000 Datensätze gehen (9000 IDs) und Batchsize Variable 1000

private void updateMethod(List<Long> idList) 
{ 
    int batchSizeCount = 0; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    Connection con = criteriaWrapper.getConnection(); 
    StringBuilder sb = new StringBuilder("UPDATE sample_table SET column_name1 = 1 , column_name2 = SYSTIMESTAMP WHERE sample_table.table_id = ? "); 

    try 
    { 
     con.setAutoCommit(false); 
     ps = con.prepareStatement(sb.toString()); 

     for(Long table_id : idList) 
     { 
      int count = 0; 
      ps.setLong(++count, table_id); 
      ps.addBatch(); 
      if (++batchSizeCount % batchSize == 0) 
      { 
       ps.executeBatch(); 
       functionProvider.logger(); //Prints previously appended logs 
      } 
     } 
     ps.executeBatch(); 
     con.commit(); 
     con.setAutoCommit(true); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     DBUtility.close(rs); 
     DBUtility.close(ps); 
    } 
} 

Antwort

0

gesetzt Wenn Sie Feder verwenden können, muss es eine einfache Möglichkeit :

jdbcTemplate.batchUpdate (Abfrage, InsertParameters). Ich habe Millionen von Transaktionen getestet und es dauert nur wenige Sekunden.

+0

Leider ist die Verwendung von Feder keine Option für mich. – direndd

+0

Spring Batch macht intern die gleiche Sache von dem, was Sie tun. Es ist in der Lage, viel mehr als 9k in einer einzigen Charge zu handhaben. Sie können problemlos in einem einzigen Batch ausführen. Möglicherweise müssen Sie den Rückgabewert von execute überwachen, um zu sehen, wie viel erfolgreich war, um zu entscheiden, ob Sie das Commit durchführen wollen oder nicht. – krmanish007