Jeśli każdy wiersz powinien otrzymać inną wartość, której nie można wyprowadzić z istniejących danych w bazie danych, niewiele można zrobić, aby zoptymalizować ogólną złożoność. Więc nie oczekuj zbyt wielu cudów.
To powiedziawszy, powinieneś zacząć używać przygotowanych wyciągów i grupowania:
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 robi:
- przygotowana instrukcja powoduje, że parser SQL parsuje SQL tylko raz
- przetwarzanie wsadowe minimalizuje przeloty w obie strony klient-serwer, tak że nie jedna dla każdej aktualizacji
- Komunikacja między klientem a serwerem jest zminimalizowana, ponieważ SQL jest przesyłany tylko raz, a dane są gromadzone i wysyłane jako pakiet (lub przynajmniej mniej pakietów)
Ponadto:
- Sprawdź, czy kolumna bazy danych
profileId
używa indeksu, dzięki czemu wyszukiwanie odpowiedniego wiersza jest wystarczająco szybkie - Możesz sprawdzić, czy połączenie jest ustawione na automatyczne zatwierdzanie. Jeśli tak, spróbuj wyłączyć automatyczne zatwierdzanie i jawnie zatwierdź transakcję po zaktualizowaniu wszystkich wierszy. W ten sposób operacje pojedynczej aktualizacji mogą być również szybsze.