Jika setiap baris harus mendapatkan nilai berbeda yang tidak dapat diturunkan dari data yang ada di database, tidak banyak yang dapat Anda lakukan untuk mengoptimalkan kompleksitas keseluruhan. Jadi jangan berharap terlalu banyak keajaiban.
Karena itu, Anda harus mulai menggunakan pernyataan dan pengelompokan yang telah disiapkan:
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
}
Fungsinya:
- pernyataan yang disiapkan menyebabkan pengurai SQL hanya mengurai SQL sekali
- pengelompokan meminimalkan perjalanan pulang pergi klien-server sehingga tidak satu untuk setiap pembaruan
- komunikasi antara klien dan server diminimalkan karena SQL hanya ditransmisikan sekali dan data dikumpulkan dan dikirim sebagai paket (atau setidaknya lebih sedikit paket)
Selain itu:
- Harap periksa apakah kolom database
profileId
menggunakan indeks sehingga mencari baris masing-masing cukup cepat - Anda dapat memeriksa apakah koneksi Anda disetel ke komit otomatis. Jika demikian, coba nonaktifkan komit otomatis dan komit transaksi secara eksplisit setelah semua baris diperbarui. Dengan cara ini, operasi pembaruan tunggal juga bisa lebih cepat.