Pokud by každý řádek měl získat jinou hodnotu, kterou nelze odvodit z existujících dat v databázi, nemůžete udělat mnoho pro optimalizaci celkové složitosti. Nečekejte tedy příliš mnoho zázraků.
To znamená, že byste měli začít používat připravené příkazy a dávkování:
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
}
Co to dělá:
- připravený příkaz způsobí, že analyzátor SQL analyzuje SQL pouze jednou
- dávkování minimalizuje zpáteční cesty klient-server, takže pro každou aktualizaci není jeden
- Komunikace mezi klientem a serverem je minimalizována, protože SQL se přenáší pouze jednou a data se shromažďují a odesílají jako pakety (nebo alespoň méně paketů)
Navíc:
- Zkontrolujte, zda sloupec databáze
profileId
používá index, takže vyhledání příslušného řádku je dostatečně rychlé - Můžete zkontrolovat, zda je vaše připojení nastaveno na automatické potvrzení. Pokud ano, zkuste deaktivovat automatické potvrzení a explicitně potvrdit transakci po aktualizaci všech řádků. Tímto způsobem by operace jedné aktualizace mohly být také rychlejší.