Topik ini menjelaskan cara menggunakan Druid untuk terhubung dan memanfaatkan LindormTable.
Prasyarat
Fitur kompatibilitas MySQL harus diaktifkan untuk instance tersebut. Untuk informasi lebih lanjut, lihat Aktifkan Fitur Kompatibilitas MySQL.
Java Development Kit (JDK) versi 1.8 atau yang lebih baru harus sudah terinstal.
Alamat IP klien Anda harus ditambahkan ke daftar putih instance Lindorm Anda. Untuk informasi lebih lanjut, lihat Konfigurasikan Daftar Putih.
Catatan penggunaan
Node frontend SQL Lindorm menggunakan Server Load Balancer (SLB) untuk load balancing, dan klien terhubung ke node frontend ini. Untuk mendistribusikan permintaan klien secara merata di seluruh node frontend, kami menyarankan Anda menghindari mempertahankan koneksi terlalu lama. Untuk mencapai hal ini, Anda dapat mengonfigurasi parameter
phyMaxUseCount.Anda perlu mendapatkan koneksi dari connection pool sebelum menjalankan query, dan memanggil operasi
conn.close()untuk mengembalikan koneksi ke pool setelah query. Saat menjalankan query berikutnya, Anda bisa mendapatkan koneksi lagi dari connection pool. Jika koneksi tidak dikembalikan setelah query dan menjadi tidak valid, Druid tidak dapat mendeteksi status tidak validnya.Dalam lingkungan jaringan yang kompleks, gangguan koneksi mungkin terjadi karena hambatan performa gateway, tautan jaringan panjang, jitter jaringan, tingkat retransmisi tinggi, atau tingkat kehilangan paket tinggi. Kami menyarankan Anda mengonfigurasi connection pool dengan benar dan menerapkan mekanisme retry dalam kode bisnis Anda jika diperlukan.
Saat server ditingkatkan dan di-restart, koneksi mungkin terputus sementara. Bahkan dengan connection pool, bisnis Anda mungkin mengalami pengecualian. Kami menyarankan Anda menangkap pengecualian dan menerapkan mekanisme retry.
Kami menyarankan Anda memodifikasi konfigurasi connection pool sesuai kebutuhan bisnis Anda dan memastikan bahwa konfigurasi tersebut berlaku. Anda dapat secara berkala menanyakan konfigurasi efektif dan informasi connection pool di program Anda menggunakan metode
DruidDataSource#getStatData()danDruidDataSource#dump(), serta memeriksa konfigurasi dalam log.
Prosedur
Sebelum menggunakan Druid untuk terhubung ke LindormTable, Anda harus menginstal Druid dan Lindorm JDBC Driver.
Sebagai contoh, Anda dapat menambahkan dependensi berikut ke file
pom.xmldi 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 ingin menggunakan druid-spring-boot-starter untuk memulai Druid, Anda harus terlebih dahulu mengecualikan komponen druid yang digunakan oleh druid-spring-boot-starter dan kemudian secara eksplisit menambahkan dependensi pada komponen druid ke file konfigurasi. Contoh berikut menunjukkan cara mengonfigurasi dependensi saat Anda 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>mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> </dependency>Konfigurasikan parameter untuk Druid. Di jalur
src/main/resourcesproyek Maven Anda, buat filedruid.propertiesdan tambahkan konfigurasi berikut ke file tersebut:# Tentukan nama kelas driver. Anda dapat mempertahankan konfigurasi ini tanpa perubahan. driverClassName=com.mysql.cj.jdbc.Driver # url adalah titik akhir JDBC untuk MySQL untuk mengakses LindormTable. Nama pengguna dan kata sandi adalah kredensial untuk mengakses LindormTable. # Ganti parameter database dengan nama database yang ingin Anda hubungkan. Kami menyarankan Anda untuk mempertahankan parameter lainnya tanpa perubahan untuk meningkatkan performa. url=jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/database?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000 username=**** password=**** # Inisialisasi connection pool untuk membuat koneksi. Kami menyarankan Anda untuk mempertahankan konfigurasi ini tanpa perubahan. init=true # Tentukan jumlah koneksi yang ingin Anda buat selama inisialisasi. Anda dapat mengonfigurasi parameter ini berdasarkan kebutuhan Anda. initialSize=10 # Tentukan jumlah maksimum koneksi dalam connection pool. Anda dapat mengonfigurasi parameter ini berdasarkan kebutuhan Anda. Kami menyarankan Anda untuk menyetel parameter ini ke nilai yang sama dengan thread pool dalam bisnis Anda. maxActive=40 # Tentukan jumlah minimum koneksi idle dalam connection pool. Anda dapat mengonfigurasi parameter ini berdasarkan kebutuhan Anda. Untuk skenario performa tinggi, kami menyarankan Anda untuk menyetel parameter ini ke nilai yang sama dengan parameter maxActive. Jika bisnis Anda memiliki fluktuasi signifikan, kami menyarankan Anda untuk menyetel parameter ini ke nilai yang lebih kecil. minIdle=40 # Tentukan waktu maksimum yang dapat ditunggu klien untuk mendapatkan koneksi. Unit: ms. Kami menyarankan Anda untuk mempertahankan nilai ini tanpa perubahan. maxWait=30000 # Konfigurasikan batas penggunaan maksimum untuk koneksi untuk menghindari beban server yang tidak merata akibat penggunaan koneksi yang sama dalam waktu lama. Ini memiliki sedikit dampak pada performa. phyMaxUseCount=30000 # Konfigurasikan parameter terkait keep-alive koneksi. Kami menyarankan Anda untuk mempertahankan konfigurasi ini tanpa perubahan. Jika tidak, koneksi mungkin terputus secara tak terduga. druid.keepAlive=true # Tentukan periode idle yang diizinkan untuk koneksi. Jika koneksi telah dalam keadaan idle selama periode lebih lama dari nilai ini, validitas koneksi akan diperiksa. druid.keepAliveBetweenTimeMillis=120000 # Tentukan interval di mana koneksi ditentukan untuk dihapus atau tetap hidup. timeBetweenEvictionRunsMillis=60000 # Tentukan waktu penghapusan koneksi idle. minEvictableIdleTimeMillis=1800000 maxEvictableIdleTimeMillis=1800000 # Konfigurasikan parameter yang diperlukan untuk memverifikasi koneksi. Kami menyarankan Anda untuk mempertahankan konfigurasi ini tanpa perubahan. testWhileIdle=true testOnBorrow=false testOnReturn=falseParameter
Parameter
Deskripsi
url
URL yang digunakan oleh Java JDBC untuk klien Druid terhubung ke database MySQL. URL berada dalam format berikut:
jdbc:mysql://<Titik akhir LindormTable untuk MySQL>/<Nama database>?<Pengaturan koneksi>.Jika Anda tidak menentukan nama database dalam URL, klien terhubung ke database default. Untuk informasi lebih lanjut tentang cara mendapatkan LindormTable endpoint for MySQL, lihat Lihat titik akhir.
Jika Anda menentukan parameter koneksi, performa dapat ditingkatkan. Kami menyarankan Anda untuk menentukan semua parameter. Untuk informasi lebih lanjut tentang pengaturan koneksi, lihat Pengaturan koneksi.
PentingJika aplikasi Anda diterapkan pada instance Elastic Compute Service (ECS), kami menyarankan Anda untuk menggunakan virtual private cloud (VPC) untuk terhubung ke instance Lindorm demi keamanan yang lebih tinggi dan latensi yang lebih rendah.
Jika aplikasi Anda diterapkan pada server lokal dan perlu terhubung ke instance Lindorm melalui Internet, Anda dapat melakukan langkah-langkah berikut untuk mengaktifkan titik akhir publik untuk instance tersebut di konsol Lindorm: Di panel navigasi di sebelah kiri, pilih . Pada tab Wide Table Engine, klik Enable Public Endpoint.
Jika Anda menggunakan VPC untuk mengakses instance Lindorm, tentukan LindormTable VPC endpoint for MySQL dalam nilai url. Jika Anda menggunakan Internet untuk mengakses instance Lindorm, tentukan LindormTable Internet endpoint for MySQL dalam nilai url.
username
Jika Anda lupa kata sandi Anda, Anda dapat mengubah kata sandi di sistem manajemen kluster LindormTable. Untuk informasi lebih lanjut, lihat bagian Ubah kata sandi pengguna dari topik "Kelola pengguna".
password
Muat konfigurasi parameter Druid dan inisialisasi connection pool.
// Muat konfigurasi parameter. Properties properties = new Properties(); InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(inputStream); // Inisialisasi connection pool. DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Gunakan Druid untuk mendapatkan informasi koneksi dari JDBC dan terhubung ke LindormTable.
/* -------------- Contoh cara terhubung 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 = "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); } } // Tulis data 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); // Tambahkan operasi tulis ke batch. ps.addBatch(); } // Eksekusi tulis batch. ps.executeBatch(); } } // Query 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(); } }CatatanDalam Lindorm SQL, sintaks
INSERTsetara dengan sintaksUPSERT. Namun, JDBC untuk klien MySQL dioptimalkan untuk sintaksINSERT. Oleh karena itu, kami menyarankan Anda menggunakan sintaksINSERTuntuk menulis data.Tulis batch lebih efisien daripada tulis baris tunggal dalam mengurangi panggilan RPC, memungkinkan server memproses beberapa baris sekaligus dan mencapai throughput yang lebih tinggi. Namun, jika terlalu banyak baris ditulis dalam satu batch, server mungkin mengalami kesalahan out-of-memory (OOM) atau garbage collection penuh (Full GC), yang memengaruhi stabilitas layanan. Oleh karena itu, kami menyarankan Anda mengontrol jumlah baris yang ditulis per batch.
batchSizemenunjukkan jumlah baris yang ditulis per batch, dan kami menyarankan Anda menyetel parameter ini ke nilai antara 50 hingga 100.Anda dapat meningkatkan throughput tulis dengan meningkatkan konkurensi tulis.
FAQ
P: Mengapa kesalahan Read timed out dilaporkan selama koneksi?
J: Secara default, kesalahan Read timed out dilaporkan jika koneksi dalam Druid connection pool timeout lebih dari 10 detik. Anda dapat mengonfigurasi parameter socketTimeout dalam string koneksi untuk menentukan periode timeout dalam milidetik. Sebagai contoh, atur nilainya menjadi dua menit (120.000 milidetik). Contoh: jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/" + database + "?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000.