Wenn jede Zeile einen anderen Wert erhalten soll, der nicht aus den vorhandenen Daten in der Datenbank abgeleitet werden kann, können Sie nicht viel tun, um die Gesamtkomplexität zu optimieren. Erwarten Sie also nicht zu viele Wunder.
Allerdings sollten Sie damit beginnen, vorbereitete Anweisungen und Batches zu verwenden:
public void updateRank(Map<Integer,Double> map){
Iterator<Entry<Integer, Double>> it = map.entrySet().iterator();
String query = "";
int i = 0;
Connection connection = getConnection(); // get the DB connection from somewhere
PreparedStatement stmt = connection.prepareStatement("update profile set rank = ? where profileId = ?");
while (it.hasNext()) {
Map.Entry<Integer,Double> pairs = (Map.Entry<Integer,Double>)it.next();
stmt.setInt(1, pairs.getValue());
stmt.setDouble(2, pairs.getKey());
stmt.addBatch(); // this will just collect the data values
it.remove();
}
stmt.executeBatch(); // this will actually execute the updates all in one
}
Was das bewirkt:
- Die vorbereitete Anweisung bewirkt, dass der SQL-Parser die SQL nur einmal parst
- das Batching minimiert die Client-Server-Roundtrips, so dass nicht einer für jedes Update
- Die Kommunikation zwischen Client und Server wird minimiert, da das SQL nur einmal übertragen wird und die Daten gesammelt und als Paket (oder zumindest weniger Pakete) versendet werden
Außerdem:
- Bitte überprüfen Sie, ob die Datenbankspalte
profileId
verwendet einen Index, damit das Nachschlagen der entsprechenden Zeile schnell genug ist - Sie können überprüfen, ob Ihre Verbindung auf Auto-Commit eingestellt ist. Versuchen Sie in diesem Fall, die automatische Festschreibung zu deaktivieren und die Transaktion explizit festzuschreiben, nachdem alle Zeilen aktualisiert wurden. Auf diese Weise könnten auch die einzelnen Aktualisierungsvorgänge schneller sein.