Mungkin ada berbagai jenis pengelompokan yang terlibat, dan saya akan membahas sebagian dari driver PostgreSQL JDBC (pgjdbc).
TL; DR:pgjdbc memang menggunakan lebih sedikit roundrip jaringan jika API batch digunakan. BatchedQuery
hanya digunakan jika reWriteBatchedInserts=true
diteruskan ke pengaturan koneksi pgjdbc.
Anda mungkin menemukan https://www.slideshare.net/VladimirSitnikv/postgresql-and-jdbc-striving-for-high-performance relevan (slide 44,...)
Dalam hal eksekusi kueri, latensi jaringan sering kali menjadi bagian penting dari waktu yang telah berlalu.
Misalkan kasusnya adalah menyisipkan 10 baris.
-
Tanpa pengelompokan (mis. hanya
PreparedStatement#execute
dalam satu lingkaran). Pengemudi akan melakukan yang berikutexecute query sync <-- wait for the response from the DB execute query sync <-- wait for the response from the DB execute query sync <-- wait for the response from the DB ...
Waktu penting akan dihabiskan dalam "menunggu DB"
-
API batch JDBC. Itu adalah
PreparedStatement#addBatch()
memungkinkan pengemudi mengirim beberapa "eksekusi kueri" dalam satu perjalanan pulang pergi jaringan. Implementasi saat ini, bagaimanapun, masih akan membagi batch besar menjadi batch yang lebih kecil untuk menghindari kebuntuan TCP.Tindakannya akan jauh lebih baik:
execute query ... execute query execute query execute query sync <-- wait for the response from the DB
-
Perhatikan, bahkan dengan
#addBatch
, ada perintah "eksekusi kueri" yang berlebihan. Server membutuhkan waktu yang cukup lama untuk memproses setiap pesan satu per satu.Salah satu cara untuk mengurangi jumlah kueri adalah dengan menggunakan sisipan multi-nilai. Misalnya:
insert into tab(a,b,c) values (?,?,?), (?,?,?), ..., (?,?,?)
PostgreSQL ini memungkinkan untuk menyisipkan beberapa baris sekaligus. Kekurangannya adalah Anda tidak memiliki pesan kesalahan rinci (per-baris). Saat ini Hibernate tidak mengimplementasikan penyisipan multi-nilai.
Namun pgjdbc dapat menulis ulang sisipan batch reguler menjadi multi-nilai dengan cepat sejak 9.4.1209 (2016-07-15).
Untuk mengaktifkan penulisan ulang multi-nilai, Anda perlu menambahkan
reWriteBatchedInserts=true
properti koneksi. Fitur ini awalnya dikembangkan di https://github.com/pgjdbc/pgjdbc/pull/491Cukup pintar untuk menggunakan 2 pernyataan untuk menyisipkan 10 baris. Yang pertama adalah pernyataan bernilai 8, dan yang kedua adalah pernyataan bernilai 2. Penggunaan kekuatan dua memungkinkan pgjdbc untuk menjaga jumlah pernyataan yang berbeda tetap waras, dan itu meningkatkan kinerja karena pernyataan yang sering digunakan disiapkan oleh server (lihat Berapa lama masa pakai pernyataan yang disiapkan sisi server PostgreSQL )
BatchedQuery
mewakili pernyataan multi-nilai semacam itu, jadi Anda akan melihat kelas itu digunakan direWriteBatchedInserts=true
kasus saja.Kelemahan fitur ini mungkin termasuk:detail yang lebih rendah sebagai "hasil batch". Misalnya, batch reguler memberi Anda "per jumlah baris pernyataan", namun dalam kasus multi-nilai Anda baru saja mendapatkan status "pernyataan selesai". Selain itu, penulis ulang on-the-fly mungkin gagal mengurai pernyataan SQL tertentu (mis. https://github.com/pgjdbc/pgjdbc/issues/1045 ).