全部产品
Search
文档中心

Lindorm:Gunakan Druid untuk mengembangkan aplikasi

更新时间:Nov 10, 2025

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

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() dan DruidDataSource#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.xml dalam 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

Catatan

Anda dapat mengunduh kode sampel, lalu langsung mengompilasi dan menjalankan kode tersebut di komputer lokal Anda atau mengembangkan proyek Anda sendiri berdasarkan kode sampel.

  1. Konfigurasikan parameter untuk Druid. Di jalur src/main/resources proyek Maven Anda, buat file druid.properties dan 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=-1
    Catatan
    • Sesuaikan 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.

  2. 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);
  3. 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.