全部产品
Search
文档中心

Lindorm:Tutorial: Gunakan Java Native SDK untuk terhubung ke dan menggunakan LindormTSDB

更新时间:Nov 10, 2025

Topik ini menjelaskan cara menggunakan Java Native SDK untuk terhubung ke dan menggunakan LindormTSDB.

Prasyarat

Persiapan

Sebelum menggunakan Java Native SDK untuk terhubung ke LindormTSDB, Anda harus menginstal SDK tersebut. Topik ini menggunakan versi 1.0.0 sebagai contoh. Anda dapat menginstal Java Native SDK dengan salah satu dari tiga cara berikut:

  • Cara 1 (Direkomendasikan): Impor SDK LindormTSDB untuk Java ke dalam proyek Maven. Tambahkan dependensi berikut ke bagian dependencies pada file pom.xml.

    <dependency>
      <groupId>com.aliyun.lindorm</groupId>
      <artifactId>lindorm-tsdb-client</artifactId>
      <version>1.0.4</version>
    </dependency>
    Catatan

    SDK Java LindormTSDB menyediakan proyek contoh berbasis Maven. Anda dapat mengunduh proyek contoh untuk dikompilasi dan dijalankan secara lokal, atau Anda dapat menggunakannya sebagai dasar untuk mengembangkan proyek Anda sendiri.

  • Impor paket JAR ke dalam proyek Eclipse.

    1. Unduh paket SDK Java.

    2. Ekstrak paket SDK Java yang telah diunduh.

    3. Tambahkan paket JAR yang telah diekstrak ke proyek Eclipse Anda.

      1. Di Eclipse, buka proyek Anda, klik kanan proyek tersebut, lalu pilih Properties.

      2. Pada kotak dialog yang muncul, klik Java Build Path > Libraries > Add JARs, lalu pilih file lindorm-tsdb-client-1.0.0.jar yang telah diekstrak dan paket JAR di direktori lib.

      3. Klik Apply and Close.

  • Impor paket JAR ke dalam proyek IntelliJ IDEA.

    1. Unduh paket SDK Java.

    2. Ekstrak paket SDK Java yang telah diunduh.

    3. Tambahkan paket JAR yang telah diekstrak ke proyek IntelliJ IDEA Anda.

      1. Di IntelliJ IDEA, buka proyek Anda dan klik File > Project Structure pada bilah menu.

      2. Pada panel navigasi di sisi kiri kotak dialog Project Structure, pilih Project Structure > Modules.

      3. Di sisi kanan panel, klik 添加 dan pilih JARs or directories.

      4. Pada kotak dialog yang muncul, pilih file lindorm-tsdb-client-1.0.0.jar yang telah diekstrak dan paket JAR di direktori lib, lalu klik OK.

      5. Klik Apply.

      6. Klik OK.

Catatan
  • Anda dapat memperoleh semua versi Java Native SDK untuk LindormTSDB dari repositori pusat Maven. Untuk informasi selengkapnya, lihat Repositori Maven.

  • Untuk informasi selengkapnya tentang versi Java Native SDK untuk LindormTSDB, lihat Panduan Versi.

Prosedur

  1. Buat instans database. Saat membuat LindormTSDBClient, Anda harus menentukan titik akhir LindormTSDB.

    String url = "http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242";
    // LindormTSDBClient bersifat thread-safe dan dapat digunakan kembali. Anda tidak perlu sering membuat dan menghapusnya.
    ClientOptions options = ClientOptions.newBuilder(url).build();
    LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);
  2. Buat database bernama demo dan tabel deret waktu bernama sensor. Untuk informasi selengkapnya tentang pernyataan SQL yang digunakan untuk membuat database dan tabel deret waktu, lihat CREATE DATABASE dan CREATE TABLE.

    lindormTSDBClient.execute("CREATE DATABASE demo");
    lindormTSDBClient.execute("demo","CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time BIGINT,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))");
  3. Tulis data ke tabel.

    Catatan

    Secara default, LindormTSDBClient menulis data secara asinkron dalam batch untuk meningkatkan kinerja penulisan data. Untuk menulis data secara sinkron, Anda dapat memanggil metode join() dari objek CompletableFuture<WriteResult> yang dikembalikan oleh metode write().

    int numRecords = 10;
    List<Record> records = new ArrayList<>(numRecords);
    long currentTime = System.currentTimeMillis();
    for (int i = 0; i < numRecords; i++) {
        Record record = Record
            .table("sensor")
            .time(currentTime + i * 1000)
            .tag("device_id", "F07A1260")
            .tag("region", "north-cn")
            .addField("temperature", 12.1 + i)
            .addField("humidity", 45.0 + i)
            .build();
        records.add(record);
    }
    
    CompletableFuture<WriteResult> future = lindormTSDBClient.write("demo", records);
    // Proses hasil penulisan asinkron
    future.whenComplete((r, ex) -> {
        // Tangani kegagalan penulisan
        if (ex != null) {
            System.out.println("Gagal menulis.");
            if (ex instanceof LindormTSDBException) {
                LindormTSDBException e = (LindormTSDBException) ex;
                System.out.println("Menangkap LindormTSDBException, yang berarti permintaan Anda berhasil mencapai Lindorm TSDB, "
                                   + "tetapi ditolak dengan tanggapan kesalahan karena suatu alasan.");
                System.out.println("Kode Kesalahan: " + e.getCode());
                System.out.println("SQL State:  " + e.getSqlstate());
                System.out.println("Pesan Kesalahan: " + e.getMessage());
            }  else {
                ex.printStackTrace();
            }
        } else  {
            System.out.println("Berhasil menulis.");
        }
    });
    // Ini adalah contoh cara sederhana memproses hasil penulisan dalam mode sinkron.
    System.out.println(future.join());
  4. Kueri data dari tabel deret waktu. Untuk informasi selengkapnya tentang pernyataan kueri SQL, lihat Kueri dasar.

    String sql = "select * from sensor limit 10";
    ResultSet resultSet = lindormTSDBClient.query("demo", sql);
    
    try {
        // Proses hasil kueri
        QueryResult result = null;
        // Hasil kueri dikembalikan dalam batch. Secara default, setiap batch berisi 1.000 baris.
        // Jika metode next() dari resultSet mengembalikan null, berarti semua hasil kueri telah dibaca.
        while ((result = resultSet.next()) != null) {
            List<String> columns = result.getColumns();
            System.out.println("columns: " + columns);
            List<String> metadata = result.getMetadata();
            System.out.println("metadata: " + metadata);
            List<List<Object>> rows = result.getRows();
            for (int i = 0, size = rows.size(); i < size; i++) {
                List<Object> row = rows.get(i);
                System.out.println("row #" + i + " : " + row);
            }
        }
    } finally {
        // Setelah kueri selesai, pastikan Anda memanggil metode close dari ResultSet untuk melepaskan sumber daya I/O.
        resultSet.close();
    }

Contoh kode lengkap

import com.aliyun.lindorm.tsdb.client.ClientOptions;
import com.aliyun.lindorm.tsdb.client.LindormTSDBClient;
import com.aliyun.lindorm.tsdb.client.LindormTSDBFactory;
import com.aliyun.lindorm.tsdb.client.exception.LindormTSDBException;
import com.aliyun.lindorm.tsdb.client.model.QueryResult;
import com.aliyun.lindorm.tsdb.client.model.Record;
import com.aliyun.lindorm.tsdb.client.model.ResultSet;
import com.aliyun.lindorm.tsdb.client.model.WriteResult;
import com.aliyun.lindorm.tsdb.client.utils.ExceptionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public class QuickStart {

    public static void main(String[] args) {

        // 1. Buat instans klien.
        String url = "http://ld-xxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242";
        // LindormTSDBClient bersifat thread-safe dan dapat digunakan kembali. Anda tidak perlu sering membuat dan menghapusnya.
        ClientOptions options = ClientOptions.newBuilder(url).build();
        LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);

        // 2. Buat database bernama demo dan tabel bernama sensor.
        lindormTSDBClient.execute("CREATE DATABASE demo");
        lindormTSDBClient.execute("demo","CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time BIGINT,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))");

        // 3. Tulis data.
        int numRecords = 10;
        List<Record> records = new ArrayList<>(numRecords);
        long currentTime = System.currentTimeMillis();
        for (int i = 0; i < numRecords; i++) {
            Record record = Record
                    .table("sensor")
                    .time(currentTime + i * 1000)
                    .tag("device_id", "F07A1260")
                    .tag("region", "north-cn")
                    .addField("temperature", 12.1 + i)
                    .addField("humidity", 45.0 + i)
                    .build();
            records.add(record);
        }

        CompletableFuture<WriteResult> future = lindormTSDBClient.write("demo", records);
        // Proses hasil penulisan asinkron.
        future.whenComplete((r, ex) -> {
            // Tangani kegagalan penulisan.
            if (ex != null) {
                System.out.println("Gagal menulis.");
                Throwable throwable = ExceptionUtils.getRootCause(ex);
                if (throwable instanceof LindormTSDBException) {
                    LindormTSDBException e = (LindormTSDBException) throwable;
                    System.out.println("Menangkap LindormTSDBException, yang berarti permintaan Anda berhasil mencapai Lindorm TSDB, "
                            + "tetapi ditolak dengan tanggapan kesalahan karena suatu alasan.");
                    System.out.println("Kode Kesalahan: " + e.getCode());
                    System.out.println("SQL State:  " + e.getSqlstate());
                    System.out.println("Pesan Kesalahan: " + e.getMessage());
                }  else {
                    throwable.printStackTrace();
                }
            } else  {
                System.out.println("Berhasil menulis.");
            }
        });
        // Ini adalah contoh tunggu sinkron sederhana.
        System.out.println(future.join());

        // 4. Kueri data.
        String sql = "select * from sensor limit 10";
        ResultSet resultSet = lindormTSDBClient.query("demo", sql);

        try {
            // Proses hasil kueri.
            QueryResult result = null;
            // Hasil kueri dikembalikan dalam batch. Secara default, setiap batch berisi 1.000 baris.
            // Jika metode next() dari resultSet mengembalikan null, berarti semua hasil kueri telah dibaca.
            while ((result = resultSet.next()) != null) {
                List<String> columns = result.getColumns();
                System.out.println("columns: " + columns);
                List<String> metadata = result.getMetadata();
                System.out.println("metadata: " + metadata);
                List<List<Object>> rows = result.getRows();
                for (int i = 0, size = rows.size(); i < size; i++) {
                    List<Object> row = rows.get(i);
                    System.out.println("row #" + i + " : " + row);
                }
            }
        } finally {
            // Setelah kueri selesai, pastikan Anda memanggil metode close dari ResultSet untuk melepaskan sumber daya I/O.
            resultSet.close();
        }

        lindormTSDBClient.shutdown();
    }
}