AnalyticDB for PostgreSQL Client Software Development Kit (SDK) menyediakan metode berkinerja tinggi untuk menyalin data ke AnalyticDB for PostgreSQL melalui API.
Anda dapat menggunakan AnalyticDB for PostgreSQL Client SDK untuk mengembangkan program kustom guna menulis data. SDK ini menyederhanakan proses penulisan data ke AnalyticDB for PostgreSQL tanpa perlu mengelola connection pools atau cache. Mekanisme internal seperti parallel processing memberikan peningkatan kinerja signifikan dibandingkan operasi penulisan langsung menggunakan COPY atau INSERT.
Fungsi utama AnalyticDB for PostgreSQL Client SDK adalah menulis data yang Anda sediakan secara efisien. SDK ini tidak membaca atau memproses data mentah.

Repositori Maven
Anda dapat menggunakan Maven untuk mengelola dan mengonfigurasi versi SDK. Berikut adalah konfigurasi Maven-nya:
<dependency>
<groupId>com.alibaba.cloud.analyticdb</groupId>
<artifactId>adb4pgclient</artifactId>
<version>1.0.16</version>
</dependency>AnalyticDB for PostgreSQL Client SDK bergantung pada paket-paket berikut: druid 1.1.17, postgresql-jdbc 42.3.9, commons-lang3 3.4, slf4j-api 1.7.24, dan slf4j-log4j12 1.7.24.
Jika terjadi konflik versi, periksa versi paket-paket tersebut dan selesaikan konfliknya.
Anda dapat mengunduh paket JAR offline dari tautan berikut: adb4pgclient-1.0.16.jar dan adb4pgclient-1.0.16-jar-with-dependencies.jar.
Metode
Tabel 1. Kelas DatabaseConfig
Nama API | Deskripsi |
setHost(String adbHost) | Alamat koneksi instans AnalyticDB for PostgreSQL yang akan dihubungkan. |
setPort(int port) | Port instans AnalyticDB for PostgreSQL. Nilai default-nya adalah 5432. |
setDatabase(String database) | Nama database AnalyticDB for PostgreSQL yang akan dihubungkan. |
setUser(String username) | Username untuk koneksi ke database AnalyticDB for PostgreSQL. |
setPassword(String pwd) | Password untuk koneksi ke database AnalyticDB for PostgreSQL. |
addTable(List<String> table, String schema) | Daftar tabel yang akan ditulis. Tambahkan tabel secara terpisah berdasarkan skemanya. Anda dapat memanggil metode ini beberapa kali. Metode ini tidak lagi berlaku setelah objek DatabaseConfig digunakan untuk membuat objek Adb4PGClient. |
setColumns(List<String> columns, String tableName, String schemaName) | Kolom-kolom pada tabel tempat data akan dimasukkan. Untuk memasukkan data ke semua kolom, gunakan |
setInsertIgnore(boolean insertIgnore) | Menentukan apakah baris data yang menyebabkan konflik primary key diabaikan. Pengaturan ini berlaku untuk semua tabel yang dikonfigurasi. Nilai default-nya adalah false, artinya baris yang bertabrakan akan ditimpa. |
setEmptyAsNull(boolean emptyAsNull) | Menentukan apakah data kosong diatur sebagai null. Pengaturan ini berlaku untuk semua tabel yang dikonfigurasi. Nilai default-nya adalah false. |
setParallelNumber(int parallelNumber) | Jumlah thread konkuren untuk menulis data ke AnalyticDB for PostgreSQL. Pengaturan ini berlaku untuk semua tabel yang dikonfigurasi. Nilai default-nya adalah 4. Kami tidak menyarankan mengubah nilai ini dalam kebanyakan kasus. |
setLogger(Logger logger) | Objek logger yang digunakan dalam client. Gunakan slf4j.Logger. |
setRetryTimes(int retryTimes) | Jumlah percobaan ulang ketika terjadi exception selama commit ke AnalyticDB for PostgreSQL. Nilai default-nya adalah 3. |
setRetryIntervalTime(long retryIntervalTime) | Interval percobaan ulang. Satuannya milidetik (ms). Nilai default-nya adalah 1000 ms. |
setCommitSize(long commitSize) | Volume data dalam byte untuk autocommit. Nilai default-nya adalah 10 MB. Kami tidak menyarankan mengubah pengaturan ini. |
setEnablePreHash(boolean enablePreHash) | Jika tabel tujuan menggunakan penyimpanan Beam dan terjadi deadlock selama proses penulisan, aktifkan sakelar ini untuk meningkatkan kinerja penulisan. |
setMetaDataSchedulerInterval(int metaDataSchedulerInterval) | Menyesuaikan interval pembaruan metadata untuk tabel tulis di AnalyticDB for PostgreSQL Client SDK. Nilai default-nya adalah 1 menit. Satuannya menit (min). |
Tabel 2. Kelas Row
Nama API | Deskripsi |
setColumn(int index, Object value) | Menyetel nilai kolom. Anda harus menyetel kolom secara berurutan. Dengan metode ini, instance Row tidak dapat digunakan ulang. Setiap catatan data harus memiliki instance Row terpisah. |
setColumnValues(List<Object> values) | Menulis baris data dalam format List langsung ke dalam Row. |
updateColumn(int index, Object value) | Memperbarui nilai kolom. Dengan metode ini, instance Row dapat digunakan ulang. Cukup perbarui data dalam instance Row tersebut. |
Tabel 3. Kelas Adb4pgClient
Nama API | Deskripsi |
addRow(Row row, String tableName, String schemaName) / addRows(List<Row> rows, String tableName, String schemaName) | Memasukkan catatan data dalam format baris. Data disimpan dalam buffer SDK dan menunggu untuk di-commit. Jika volume data melebihi nilai `commitSize`, autocommit dipicu selama pemanggilan `addRow` atau `addRows` sebelum data baru ditambahkan. Jika autocommit gagal, Anda harus menangani exception tersebut, yang berisi daftar catatan data yang gagal. |
addMap(Map<String, String> dataMap,String tableName, String schemaName) / addMaps(List<Map<String, String>> dataMaps, String tableName, String schemaName) | Memasukkan catatan data dalam format map. Metode ini mirip dengan `addRow`. Jika buffer penuh, autocommit dipicu selama pemanggilan `addMap` atau `addMaps` sebelum data baru ditambahkan. Jika autocommit gagal, Anda harus menangani exception tersebut, yang berisi daftar catatan data yang gagal. |
commit() | Commit data yang di-cache ke AnalyticDB for PostgreSQL. Jika commit gagal, exception yang berisi statement yang gagal dilemparkan. Anda harus menangani exception ini. |
TableInfo getTableInfo(String tableName, String schemaName) | Mengambil informasi struktur tabel yang ditentukan. |
List<ColumnInfo> getColumnInfo(String tableName, String schemaName) | Mengambil daftar kolom untuk tabel yang ditentukan. Kolom dikembalikan sebagai objek `ColumnInfo`. Anda dapat menggunakan metode |
stop() | Setelah selesai menggunakan instans, panggil metode `stop` untuk melepaskan kolam thread internal dan sumber daya lainnya. Jika terdapat data yang belum di-commit di memori, exception akan dilemparkan. Untuk memaksa berhenti, gunakan metode |
forceStop() | Secara paksa melepaskan kolam thread internal dan sumber daya lainnya. Semua data yang belum di-commit dan di-cache di memori akan hilang. Metode ini tidak disarankan untuk penggunaan umum. |
Connection getConnection() throws SQLException | Mengambil objek `Connection` database dari kolam koneksi client. Anda dapat menggunakan objek `Connection` yang diambil untuk operasi selain COPY. Objek ini digunakan sama seperti koneksi Java Database Connectivity (JDBC) standar. Catatan Setelah selesai menggunakan koneksi, Anda harus melepaskan sumber daya terkait, seperti objek `ResultSet`, `Statement`, dan `Connection`. |
Tabel 4. Kelas ColumnInfo
Nama API | Deskripsi |
boolean isNullable() | Memeriksa apakah kolom dapat bernilai null. |
Kode kesalahan | Kode kesalahan | Deskripsi |
COMMIT_ERROR_DATA_LIST | 101 | Terjadi exception pada sebagian data selama commit. Data yang gagal dikembalikan. Catatan Gunakan |
COMMIT_ERROR_OTHER | 102 | Terjadi exception lain selama commit. |
ADD_DATA_ERROR | 103 | Terjadi exception saat menambahkan data. |
CREATE_CONNECTION_ERROR | 104 | Terjadi exception saat membuat koneksi. |
CLOSE_CONNECTION_ERROR | 105 | Terjadi exception saat menutup koneksi. |
CONFIG_ERROR | 106 | Terjadi kesalahan konfigurasi dalam DatabaseConfig. |
STOP_ERROR | 107 | Terjadi kesalahan saat menghentikan instans. |
OTHER | 999 | Kode kesalahan exception default. |
Contoh kode
public class Adb4pgClientUsage {
public void demo() {
DatabaseConfig databaseConfig = new DatabaseConfig();
// Harus menyetel host atau URL database Anda yang sebenarnya
databaseConfig.setHost("100.100.100.100");
// Harus menyetel port database Anda yang sebenarnya
databaseConfig.setPort(8888);
// Username untuk koneksi database.
databaseConfig.setUser("your user name");
// Password untuk koneksi database.
databaseConfig.setPassword("your password");
// Database yang akan dihubungkan.
databaseConfig.setDatabase("your database name");
// Menyetel daftar tabel yang akan ditulis.
List<String> tables = new ArrayList<String>();
tables.add("your table name 1");
tables.add("your table name 2");
// Anda dapat memanggil addTable secara terpisah untuk tabel-tabel dalam skema berbeda. Namun, setelah instans Client dibuat dari DatabaseConfig, konfigurasi tabel tidak dapat diubah. /
// Jika Anda mengirimkan null untuk skema, skema default 'public' akan digunakan.
databaseConfig.addTable(tables, "table schema name");
// Menyetel kolom-kolom tabel yang akan ditulis.
List<String> columns = new ArrayList<String>();
columns.add("column1");
columns.add("column2");
// Untuk menulis ke semua kolom, gunakan columns.add("*").
databaseConfig.setColumns(columns, "your table name 1", "table schema name");
databaseConfig.setColumns(Collections.singletonList("*"),"your table name 2", "table schema name");
// Jika nilai kolom kosong, atur sebagai null
databaseConfig.setEmptyAsNull(false);
// Gunakan metode 'insert ignore' untuk penyisipan.
databaseConfig.setInsertIgnore(true);
// Coba ulang tiga kali jika terjadi exception saat menulis ke database selama commit.
databaseConfig.setRetryTimes(3);
// Interval percobaan ulang adalah 1 detik. Satuannya ms.
databaseConfig.setRetryIntervalTime(1000);
// Inisialisasi AdbClient. Setelah instans diinisialisasi, pengaturan DatabaseConfig tidak dapat diubah.
Adb4pgClient adbClient = new Adb4pgClient(databaseConfig);
// Batch data. Tambahkan beberapa kali, lalu commit. Untuk detail ukuran batch, lihat bagian "Catatan".
for (int i = 0; i < 10; i++) {
// Tambahkan baris ke buffer. Satu instance untuk satu catatan
Row row = new Row(columns.size());
// Setel kolom
// indeks kolom harus sama dengan urutan kolom
// nilai kolom bisa berupa tipe apa pun, secara internal akan diformat sesuai tipe kolom
row.setColumn(0, i); // Nilai angka
row.setColumn(1, "string value"); // Nilai string
// Jika buffer penuh, autocommit dipicu selama pemanggilan addRow atau addMap.
// Jika commit gagal, AdbClientException dikembalikan dengan kode kesalahan COMMIT_ERROR_DATA_LIST.
adbClient.addRow(row, "your table name 1", "table schema name");
}
Row row = new Row();
row.setColumn(0, 10); // Nilai angka
row.setColumn(1, "2018-01-01 08:00:00"); // Nilai tanggal/waktu
adbClient.addRow(row, "your table name 1", "table schema name");
// Perbarui kolom. Instance Row dapat digunakan ulang.
row.updateColumn(0, 11);
row.updateColumn(1, "2018-01-02 08:00:00");
adbClient.addRow(row, "your table name 1", "table schema name");
// Tambahkan map ke buffer
Map<String, String> rowMap = new HashMap<String, String>();
rowMap.put("t1", "12");
rowMap.put("t2", "string value");
// Batch diperlukan di sini. Kami menyarankan melakukan commit setelah beberapa pemanggilan add.
adbClient.addMap(rowMap, "your table name 2", "table schema name");
// Commit buffer ke ADS
// Buffer dibersihkan setelah berhasil di-commit ke ADS
try {
adbClient.commit();
} catch (Exception e) {
// TODO: Tangani exception di sini
} finally {
adbClient.stop();
}
}
}Catatan
AnalyticDB for PostgreSQL Client SDK tidak thread-safe. Di lingkungan multi-threaded, setiap thread harus memiliki objek `Client` sendiri.
PentingKami tidak menyarankan berbagi instans SDK di antara beberapa thread. Selain masalah keamanan thread, client yang dibagikan dapat dengan mudah menjadi bottleneck kinerja penulisan.
Data dianggap berhasil ditulis ke AnalyticDB for PostgreSQL hanya setelah pemanggilan `commit` berhasil.
Saat client melemparkan exception, Anda harus memutuskan cara menanganinya berdasarkan kode kesalahan. Jika terjadi kesalahan penulisan data, Anda dapat mengirim ulang data tersebut, atau mencatat data bermasalah lalu melewatkannya.
Menggunakan lebih banyak thread penulisan tidak selalu menghasilkan kinerja yang lebih baik. Karena aplikasi sering melakukan batching data, konsumsi memori bisa tinggi. Oleh karena itu, Anda harus memantau status garbage collection (GC) aplikasi secara ketat.
Jangan gunakan ukuran batch yang terlalu kecil. Jika tidak, manfaat penulisan batch akan hilang. Jika memungkinkan, kami menyarankan menambahkan minimal 10.000 catatan sebelum melakukan commit data.
Anda harus menyetel semua item konfigurasi `DatabaseConfig` sebelum objek client diinisialisasi. Pengaturan ini tidak dapat diubah setelah objek client dibuat.
Client SDK dirancang untuk mengoptimalkan kinerja penulisan (INSERT). Untuk operasi SQL lainnya, ambil koneksi JDBC menggunakan metode
getConnection()dan tangani operasi tersebut melalui antarmuka JDBC standar.