Druid adalah kumpulan koneksi Java Database Connectivity (JDBC) yang digunakan untuk terhubung ke database. Topik ini menjelaskan cara menggunakan Druid untuk terhubung dan menggunakan LindormTable.
Prasyarat
Java Development Kit (JDK) 1.8 atau versi yang lebih baru telah diinstal.
Daftar putih telah dikonfigurasi untuk instance Lindorm. Untuk informasi lebih lanjut, lihat Konfigurasikan Daftar Putih.
Versi LindormTable adalah 2.3.1 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui versi LindormTable, lihat Perbarui Versi Mesin Minor dari Instance Lindorm.
Pertimbangan
Node frontend Lindorm menggunakan Server Load Balancer (SLB) untuk load balancing, dan klien terhubung ke node frontend tersebut. Untuk mendistribusikan permintaan klien secara merata di seluruh node frontend, kami menyarankan agar Anda tidak mempertahankan koneksi terlalu lama. Anda dapat mengonfigurasi parameter phyMaxUseCount dan phyTimeoutMillis.
Anda perlu mendapatkan koneksi dari kolam koneksi sebelum mengeksekusi kueri, dan memanggil operasi
conn.close()untuk mengembalikan koneksi ke kolam setelah kueri selesai. Saat Anda mengeksekusi kueri berikutnya, Anda dapat mengambil koneksi lagi dari kolam koneksi. Jika koneksi tidak dikembalikan setelah kueri dan menjadi tidak valid, Druid tidak dapat mendeteksi status tidak valid tersebut.Di lingkungan jaringan yang kompleks, gangguan koneksi dapat terjadi karena bottleneck performa gerbang, tautan jaringan yang panjang, fluktuasi jaringan, laju pengiriman ulang yang tinggi, atau tingkat kehilangan paket yang tinggi. Kami menyarankan agar Anda mengonfigurasi kolam koneksi dengan tepat dan menerapkan mekanisme retry dalam kode bisnis Anda jika diperlukan.
Saat server ditingkatkan dan dimulai ulang, koneksi mungkin terputus sementara. Bahkan dengan kolam koneksi, bisnis Anda mungkin mengalami pengecualian. Kami menyarankan agar Anda menangkap pengecualian dan menerapkan mekanisme retry.
Ubah konfigurasi kolam koneksi sesuai kebutuhan dan pastikan konfigurasi tersebut berlaku. Anda dapat secara berkala mengkueri konfigurasi efektif dan informasi kolam koneksi dalam program Anda menggunakan metode
DruidDataSource#getStatData()danDruidDataSource#dump(), serta memeriksa konfigurasi dalam log.
Persiapan
Sebelum menggunakan Druid untuk menghubungkan ke LindormTable, Anda harus menginstal Druid dan Lindorm JDBC Driver. Misalnya, Anda dapat menambahkan dependensi berikut ke file
pom.xmldalam proyek Maven Anda:<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>com.aliyun.lindorm</groupId> <artifactId>lindorm-all-client</artifactId> <version>2.2.1.3</version> </dependency>Jika Anda ingin menggunakan druid-spring-boot-starter untuk memulai Druid, Anda harus mengecualikan komponen druid tempat druid-spring-boot-starter bergantung, lalu secara eksplisit menambahkan dependensi pada komponen druid ke file konfigurasi. Contoh berikut menunjukkan cara mengonfigurasi dependensi saat menggunakan druid-spring-boot-starter untuk memulai Druid:
<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>com.aliyun.lindorm</groupId> <artifactId>lindorm-all-client</artifactId> <version>2.2.1.3</version> </dependency>
Prosedur
Anda dapat mengunduh kode sampel, lalu langsung mengompilasi dan menjalankan kode tersebut di komputer lokal Anda atau mengembangkan proyek Anda sendiri berdasarkan kode sampel.
Konfigurasikan parameter untuk Druid. Di jalur
src/main/resourcesproyek Maven Anda, buat filedruid.propertiesdan tambahkan konfigurasi berikut ke dalam file tersebut:# Tentukan nama kelas driver. Anda dapat mempertahankan konfigurasi ini tanpa perubahan. driverClassName=com.aliyun.lindorm.table.client.Driver # Anda dapat mengganti parameter url, username, dan password dengan nilai aktual dalam bisnis Anda. Anda dapat memperoleh nilai-nilai parameter ini di Konsol Lindorm. url=jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****.lindorm.rds.aliyuncs.com:30060 username=**** password=**** # Ganti **** dengan database yang ingin Anda hubungkan. connectionProperties=database=**** # Inisialisasi kolam koneksi untuk membuat koneksi. Kami menyarankan agar Anda mempertahankan konfigurasi ini tanpa perubahan. init=true # Tentukan jumlah koneksi yang ingin dibuat selama inisialisasi. Anda dapat mengonfigurasi parameter ini sesuai kebutuhan Anda. initialSize=10 # Tentukan jumlah koneksi idle dalam kolam koneksi. Anda dapat mengonfigurasi parameter ini sesuai kebutuhan Anda. Untuk skenario berkinerja-tinggi, atur parameter ini ke nilai yang sama dengan maxActive. Jika bisnis mengalami fluktuasi signifikan, atur parameter ini ke nilai yang lebih kecil. minIdle=40 # Tentukan jumlah maksimum koneksi idle dalam kolam koneksi. Anda dapat mengonfigurasi parameter ini sesuai kebutuhan Anda. Kami menyarankan agar Anda mengatur parameter ini ke nilai yang sama dengan ukuran kolam thread. maxActive=40 # Tentukan waktu maksimum yang dapat ditunggu klien untuk mendapatkan koneksi. Satuan: ms. Kami menyarankan agar Anda mempertahankan konfigurasi ini tanpa perubahan. maxWait=30000 # Tentukan jumlah maksimum penggunaan per koneksi untuk mencegah ketidakseimbangan beban di sisi server akibat penggunaan koneksi yang sama terlalu lama, yang dapat sedikit memengaruhi performa. druid.phyMaxUseCount=10000 # Konfigurasikan parameter terkait keep-alive koneksi. Kami menyarankan agar Anda mempertahankan konfigurasi ini tanpa perubahan. Jika tidak, koneksi mungkin terputus secara tak terduga. # Dalam kasus ini, pengecualian ConnectionDisconnectedException akan dilaporkan. druid.keepAlive=true druid.keepAliveBetweenTimeMillis=30000 minEvictableIdleTimeMillis=300000 maxEvictableIdleTimeMillis=600000 timeBetweenEvictionRunsMillis=5000 phyTimeoutMillis=1800000 # Konfigurasikan parameter yang diperlukan untuk memverifikasi koneksi. Kami menyarankan agar Anda mempertahankan konfigurasi ini tanpa perubahan. validationQuery=SELECT 1 testWhileIdle=true testOnBorrow=false testOnReturn=false # Konfigurasikan parameter terkait cache. Dalam contoh ini, cache dinonaktifkan. Kami menyarankan agar Anda mempertahankan konfigurasi ini tanpa perubahan. # Jika tidak, pengecualian NoSuchStatement mungkin dilaporkan. poolPreparedStatements=false maxOpenPreparedStatements=-1 druid.maxPoolPreparedStatementPerConnectionSize=-1CatatanSesuaikan atau ganti nilai parameter berikut sesuai penggunaan aktual:
url: Titik akhir yang digunakan untuk menghubungkan ke LindormTable. Untuk informasi selengkapnya tentang cara memperoleh titik akhir, lihat Memperoleh titik akhir.
username: Nama pengguna yang digunakan untuk mengakses LindormTable. Anda dapat melihat nama pengguna di sistem manajemen kluster LindormTable. Untuk informasi selengkapnya, lihat Mengelola pengguna.
password: Kata sandi yang digunakan untuk mengakses LindormTable. Jika Anda lupa kata sandi, Anda dapat mengubahnya di sistem manajemen kluster LindormTable. Untuk informasi selengkapnya tentang cara mengubah kata sandi, lihat Mengubah kata sandi pengguna.
Untuk informasi lebih lanjut tentang parameter yang dapat dikonfigurasi, lihat Konfigurasi Parameter DruidDataSource.
Muat konfigurasi parameter Druid dan inisialisasi kumpulan koneksi.
// Muat konfigurasi parameter. Properties properties = new Properties(); InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(inputStream); // Inisialisasi kumpulan koneksi. DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Gunakan Druid untuk mendapatkan informasi koneksi dari JDBC dan terhubung ke LindormTable.
/* -------------- Contoh cara menghubungkan ke LindormTable menggunakan JDBC ----------------- */ 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 data ke tabel. try (Connection connection = dataSource.getConnection()) { String sql = "upsert 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); } } // Kueri data dalam tabel. 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 dari tabel. try (Connection connection = dataSource.getConnection()) { String sql = "delete from " + tableName + " where id=?"; try (PreparedStatement ps = connection.prepareStatement(sql)) { ps.setString(1, "aa"); ps.executeUpdate(); } }
Lampiran: Penjelasan load balancing kolam koneksi
Mode kolam koneksi (koneksi persisten TCP) lebih efisien, tetapi tidak ramah terhadap load balancing terdistribusi dalam skenario berikut, yang dapat menyebabkan beban koneksi tidak merata:
Pembuatan banyak koneksi secara tiba-tiba, menyebabkan distribusi tidak merata
Saat sebuah aplikasi tiba-tiba membuat banyak koneksi, jika perangkat load balancing tidak memperbarui informasi statistik koneksi node backend secara tepat waktu, beberapa node LDServer backend mungkin menangani lebih banyak permintaan koneksi. Dikombinasikan dengan mekanisme pooling koneksi, hal ini pada akhirnya akan menyebabkan beberapa node LDServer mengalami tekanan lebih tinggi dibandingkan node lainnya, sehingga menghasilkan distribusi koneksi yang tidak merata dan memengaruhi performa sistem secara keseluruhan.
Anomali pemeriksaan kesehatan load balancing, menyebabkan distribusi tidak merata
Load balancing menggunakan pemeriksaan kesehatan aktif untuk menentukan apakah node backend berfungsi normal. Saat terjadi anomali sesekali dalam pemeriksaan kesehatan, beberapa node LDServer mungkin memiliki lebih sedikit koneksi. Dikombinasikan dengan pooling koneksi, hal ini pada akhirnya akan menyebabkan beberapa node LDServer mengalami tekanan lebih rendah dibandingkan node lainnya, sehingga memengaruhi performa sistem secara keseluruhan.
Kolam koneksi Druid telah menambahkan parameter phyTimeoutMillis dan phyMaxUseCount untuk memperbarui koneksi dalam kolam koneksi secara berkala (misalnya, setiap 30 menit atau 10.000 eksekusi). Hal ini dapat menyelesaikan masalah di atas sekaligus mempertahankan performa. Kami menyarankan agar Anda menambahkan kedua parameter ini secara default.