Om varje rad skulle få ett annat värde som inte kan härledas från befintlig data i databasen, finns det inte mycket du kan göra för att optimera den övergripande komplexiteten. Så förvänta dig inte för många underverk.
Som sagt, du bör börja använda förberedda uttalanden och batchning:
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
}
Vad detta gör:
- den förberedda satsen gör att SQL-tolkaren endast analyserar SQL en gång
- batchningen minimerar klient-server-rundturerna så att inte en för varje uppdatering
- kommunikationen mellan klient och server minimeras eftersom SQL bara sänds en gång och data samlas in och skickas som ett paket (eller åtminstone färre paket)
Dessutom:
- Kontrollera om databaskolumnen
profileId
använder ett index så att det går tillräckligt snabbt att slå upp respektive rad - Du kan kontrollera om din anslutning är inställd på auto-commit. Om så är fallet, försök att inaktivera auto-commit och explicit utföra transaktionen efter att alla rader har uppdaterats. På så sätt kan de enskilda uppdateringsoperationerna också vara snabbare.