Als elke rij een andere waarde zou moeten krijgen die niet kan worden afgeleid uit de bestaande gegevens in de database, kun je niet veel doen om de algehele complexiteit te optimaliseren. Verwacht dus niet te veel wonderen.
Dat gezegd hebbende, zou u voorbereide verklaringen en batchverwerking moeten gaan gebruiken:
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
}
Wat dit doet:
- de voorbereide instructie zorgt ervoor dat de SQL-parser de SQL slechts één keer ontleden
- de batchverwerking minimaliseert de client-server-roundtrips, zodat niet één voor elke update
- de communicatie tussen client en server wordt geminimaliseerd omdat de SQL slechts één keer wordt verzonden en de gegevens worden verzameld en verzonden als een pakket (of in ieder geval minder pakketten)
Bovendien:
- Controleer of de databasekolom
profileId
gebruikt een index zodat het opzoeken van de betreffende rij snel genoeg gaat - Je zou kunnen controleren of je verbinding is ingesteld op automatisch vastleggen. Als dat het geval is, probeer dan auto-commit uit te schakelen en de transactie expliciet vast te leggen nadat alle rijen zijn bijgewerkt. Op deze manier zouden de enkele update-bewerkingen ook sneller kunnen zijn.