Gunakan PreparedStatement dengan eksekusi batch untuk menulis beberapa record ke LindormTSDB dalam satu panggilan JDBC, sehingga mengurangi jumlah round trip dan meningkatkan throughput penulisan.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Membuat koneksi JDBC ke LindormTSDB. Untuk petunjuk pengaturan, lihat Use Lindorm JDBC Driver to connect to and use Lindorm TSDB (recommended).
Mempersiapkan tabel time series untuk ditulis. Untuk panduan desain tabel, lihat Design a time series table.
Cara kerja
PreparedStatement memungkinkan Anda mendefinisikan pernyataan INSERT sekali saja dan mengeksekusinya berulang kali dengan nilai parameter yang berbeda. Dengan memanggil addBatch() untuk setiap baris, lalu executeBatch(), semua baris dikirim dalam satu round trip ke database, yang jauh lebih efisien dibandingkan mengeksekusi pernyataan INSERT satu per satu.
Semua parameter kolom di-bind berdasarkan posisi menggunakan placeholder tanda tanya (?). Indeks yang diberikan pada setiap pemanggilan setXXX() harus sesuai dengan urutan kolom dalam pernyataan INSERT.
Tulis data dalam batch
Langkah-langkah berikut menggunakan tabel kualitas udara aqm dari Design a time series table sebagai contoh.
Buat objek
connection. Lihat Use Lindorm JDBC Driver to connect to and use Lindorm TSDB (recommended) untuk pengaturan koneksi.Buat objek
PreparedStatementdengan pernyataan INSERT.StringBuilder builder = new StringBuilder(); builder.append("INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) "); builder.append("VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); PreparedStatement preparedStmt = connection.prepareStatement(builder.toString());Bind parameter untuk setiap baris dan eksekusi batch tersebut.
for (int i = 0; i < batchSize; i++) { // Bind nilai sesuai urutan kolom dalam pernyataan INSERT. // city, district, id, ts, pm25, pm10, so2, no2 adalah variabel lokal. preparedStmt.setString(1, city); preparedStmt.setString(2, district); preparedStmt.setString(3, id); preparedStmt.setTimestamp(4, ts); preparedStmt.setDouble(5, pm25); preparedStmt.setDouble(6, pm10); preparedStmt.setDouble(7, so2); preparedStmt.setDouble(8, no2); // Masukkan baris ke antrian untuk eksekusi batch. preparedStmt.addBatch(); } // Tulis semua baris yang telah di-antri ke database. int[] results = preparedStmt.executeBatch(); // results[i] berisi jumlah update untuk setiap baris dalam batch.
Catatan penggunaan
Parameter binding: Di LindormTSDB, PreparedStatement hanya mendukung placeholder tanda tanya (?). Indeks pada setiap pemanggilan setXXX() harus tepat sesuai dengan posisi kolom dalam pernyataan INSERT.
Ukuran batch: Ukuran batch mengatur keseimbangan antara throughput dan latensi — batch yang lebih besar mengurangi jumlah round trip tetapi meningkatkan penggunaan memori dan latensi per permintaan. Batch yang lebih besar tidak selalu menghasilkan performa penulisan yang lebih baik; nilai optimal bergantung pada struktur tabel Anda.
| Struktur tabel | Direkomendasikan batchSize |
|---|---|
| Satu kolom field, hingga lima kolom tag | 5.000 |
| Struktur lainnya | Sesuaikan berdasarkan throughput dan latensi yang diamati di lingkungan Anda |