Ако всеки ред трябва да получи различна стойност, която не може да бъде извлечена от съществуващите данни в базата данни, не можете да направите много, за да оптимизирате общата сложност. Така че не очаквайте твърде много чудеса.
Въпреки това трябва да започнете да използвате подготвени оператори и пакетиране:
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
}
Какво прави това:
- подготвеният оператор кара SQL анализатора да анализира SQL само веднъж
- пакетирането минимизира пътуванията клиент-сървър, така че не едно за всяка актуализация.
- комуникацията между клиент и сървър е сведена до минимум, тъй като SQL се предава само веднъж и данните се събират и изпращат като пакет (или поне по-малко пакети)
В допълнение:
- Моля, проверете дали колоната на базата данни
profileId
използва индекс, така че търсенето на съответния ред е достатъчно бързо - Можете да проверите дали връзката ви е настроена на автоматично завършване. Ако е така, опитайте да деактивирате автоматичното извършване и изрично да завържете транзакцията, след като всички редове бъдат актуализирани. По този начин операциите за единична актуализация също могат да бъдат по-бързи.