Gunakan connection pool Alibaba Druid untuk terhubung ke LindormTable melalui titik akhir yang kompatibel dengan MySQL.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Mengaktifkan fitur kompatibilitas MySQL pada instans Lindorm Anda. Lihat Aktifkan fitur kompatibilitas MySQL.
Menginstal JDK versi 1.8 atau lebih baru.
Menambahkan alamat IP klien Anda ke daftar putih instans Lindorm Anda. Lihat Konfigurasi daftar putih.
Tambahkan dependensi
Tambahkan dependensi berikut ke file pom.xml dalam proyek Maven Anda:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>Jika Anda menggunakan `druid-spring-boot-starter`, kecualikan komponen druid bawaan dan deklarasikan dependensi druid secara eksplisit:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>Konfigurasikan connection pool
Di direktori src/main/resources proyek Maven Anda, buat file druid.properties dengan konten berikut:
# Kelas driver — jangan ubah nilai ini.
driverClassName=com.mysql.cj.jdbc.Driver
# Ganti <endpoint> dengan titik akhir LindormTable untuk MySQL dan <database> dengan nama database Anda.
# Untuk mendapatkan titik akhir, lihat Lihat titik akhir: https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints
# Jangan ubah parameter URL lainnya agar performa tetap optimal.
url=jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000
username=<username>
password=<password>
# Inisialisasi connection pool saat startup — jangan ubah nilai ini.
init=true
# Jumlah koneksi yang dibuat selama inisialisasi.
initialSize=10
# Jumlah maksimum koneksi dalam pool. Atur nilai ini sesuai dengan ukuran kolam thread aplikasi Anda.
maxActive=40
# Jumlah minimum koneksi idle. Untuk skenario throughput tinggi, atur nilai ini sama dengan maxActive.
# Untuk beban kerja dengan fluktuasi besar, gunakan nilai yang lebih kecil.
minIdle=40
# Waktu maksimum (ms) klien menunggu untuk mendapatkan koneksi — jangan ubah nilai ini.
maxWait=30000
# Membatasi berapa kali satu koneksi dapat digunakan ulang, mencegah distribusi beban yang tidak merata
# di antara node frontend SQL Lindorm. Memiliki dampak performa minor.
phyMaxUseCount=30000
# Pengaturan keep-alive — jangan ubah nilai ini untuk mencegah pemutusan koneksi tak terduga.
druid.keepAlive=true
# Jika koneksi idle lebih lama dari nilai ini (ms), validitasnya akan diperiksa.
druid.keepAliveBetweenTimeMillis=120000
# Interval (ms) pemeriksaan koneksi idle untuk eviction atau keep-alive.
timeBetweenEvictionRunsMillis=60000
# Koneksi yang idle lebih lama dari nilai ini (ms) menjadi kandidat untuk eviction.
minEvictableIdleTimeMillis=1800000
maxEvictableIdleTimeMillis=1800000
# Pengaturan validasi koneksi — jangan ubah nilai ini.
testWhileIdle=true
testOnBorrow=false
testOnReturn=falseParameter koneksi
| Parameter | Deskripsi |
|---|---|
url | URL koneksi JDBC. Format: jdbc:mysql://<titik akhir LindormTable untuk MySQL>/<nama database>?<pengaturan koneksi>. Jika Anda menghilangkan nama database, klien akan terhubung ke database default. Untuk detail semua pengaturan koneksi, lihat Pengaturan koneksi. |
username | Username LindormTable. Jika Anda lupa kata sandinya, atur ulang di sistem manajemen kluster LindormTable. Lihat Ubah kata sandi pengguna. |
password | Kata sandi LindormTable. |
Jika aplikasi Anda berjalan pada instans Elastic Compute Service (ECS), gunakan koneksi virtual private cloud (VPC) untuk latensi lebih rendah dan keamanan lebih tinggi. Tentukan titik akhir VPC LindormTable untuk MySQL pada parameter
url.Jika aplikasi Anda terhubung melalui Internet, aktifkan titik akhir publik di Konsol Lindorm: buka Database Connections > Wide Table Engine, lalu klik Enable Public Endpoint pada tab Wide Table Engine. Kemudian tentukan titik akhir Internet LindormTable untuk MySQL pada parameter
url.
Ukuran connection pool
Node frontend SQL Lindorm menggunakan Server Load Balancer (SLB) untuk load balancing. Hindari menahan koneksi dalam waktu lama agar permintaan terdistribusi merata. Konfigurasikan phyMaxUseCount untuk membatasi penggunaan ulang koneksi.
Atur
maxActivesama dengan ukuran kolam thread aplikasi Anda.Untuk beban kerja dengan throughput tinggi dan sensitif terhadap latensi, atur
minIdlesama denganmaxActiveagar koneksi selalu siap digunakan.Untuk beban kerja dengan fluktuasi trafik signifikan, gunakan nilai
minIdleyang lebih kecil untuk mengurangi konsumsi sumber daya idle.
Inisialisasi connection pool
Muat file konfigurasi dan buat sumber data:
// Muat konfigurasi dari druid.properties.
Properties properties = new Properties();
InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
// Inisialisasi connection pool.
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Jalankan operasi CRUD
Semua contoh mendapatkan koneksi dari pool dan mengembalikannya secara otomatis menggunakan try-with-resources. Jika Anda tidak menggunakan try-with-resources, panggil conn.close() secara eksplisit — ini mengembalikan koneksi ke pool, bukan menutupnya. Jika koneksi menjadi tidak valid tanpa dikembalikan, Druid tidak dapat mendeteksi status tidak valid tersebut.
String tableName = "sql_table_" + new Random().nextInt(1000);
// Buat tabel.
try (Connection connection = dataSource.getConnection()) {
try (Statement statement = connection.createStatement()) {
String sql = "create table if not exists " + tableName + "(id VARCHAR, name VARCHAR, primary key(id))";
int ret = statement.executeUpdate(sql);
System.out.println(ret);
}
}
// Masukkan satu baris data.
try (Connection connection = dataSource.getConnection()) {
String sql = "insert into " + tableName + "(id,name) values(?,?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.setString(2, "bb");
int ret = ps.executeUpdate();
System.out.println(ret);
}
}
// Masukkan data secara batch.
String insertSql = "insert into " + tableName + "(id,name) values(?,?)";
int batchSize = 100;
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement ps = connection.prepareStatement(insertSql)) {
for (int i = 0; i < batchSize; i++) {
ps.setString(1, "aa" + i);
ps.setString(2, "bb" + i);
ps.addBatch();
}
ps.executeBatch();
}
}
// Kueri data.
try (Connection connection = dataSource.getConnection()) {
String sql = "select * from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
System.out.println("id=" + id);
System.out.println("name=" + name);
}
}
}
// Hapus data.
try (Connection connection = dataSource.getConnection()) {
String sql = "delete from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.executeUpdate();
}
}Pada SQL Lindorm,
INSERTsetara denganUPSERT. Klien JDBC MySQL dioptimalkan untukINSERT, sehingga gunakan sintaksINSERTsaat menulis data.Jaga nilai
batchSizeantara 50 hingga 100. Batch yang lebih besar dapat menyebabkan error kehabisan memori (OOM) atau Full GC pada server.Untuk meningkatkan throughput tulis lebih lanjut, tingkatkan konkurensi tulis.
Pertimbangan produksi
Tangani gangguan koneksi
Di lingkungan jaringan kompleks, gangguan koneksi dapat terjadi akibat bottleneck gerbang, fluktuasi jaringan, atau kehilangan paket tinggi. Pengaturan keep-alive dalam druid.properties membantu mempertahankan koneksi idle, tetapi Anda juga harus mengimplementasikan mekanisme retry dalam kode aplikasi untuk kegagalan sementara.
Saat server ditingkatkan dan dimulai ulang, koneksi aktif mungkin terganggu sementara. Tangkap exception dan coba ulang operasi tersebut.
Monitor connection pool
Periksa secara berkala konfigurasi efektif dan statistik connection pool, serta periksa konfigurasi dalam log:
druidDataSource.getStatData(); // Mengembalikan statistik pool saat ini
druidDataSource.dump(); // Mencatat konfigurasi dan status pool secara detailFAQ
Mengapa aplikasi saya melempar error `Read timed out`?
Timeout soket default di Druid adalah 10 detik. Jika kueri memerlukan waktu lebih lama, koneksi akan timeout dan melempar error ini. Atur socketTimeout dalam milidetik pada URL JDBC. Nilai yang direkomendasikan adalah 120000 (2 menit):
jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000