このトピックでは、Java Native SDK を使用して LindormTSDB に接続し、使用する方法について説明します。
前提条件
Java 環境がインストールされていること。 JDK 1.8 以降のバージョンが必要です。
LindormTSDB のバージョンが 3.4.7 以降であること。
説明現在のバージョンを表示またはアップグレードする方法の詳細については、「LindormTSDB のバージョンガイド」および「マイナーバージョンの更新」をご参照ください。
クライアントの IP アドレスが Lindorm ホワイトリストに追加されていること。
Lindorm の 時系列エンジンエンドポイントを取得済みであること。
準備
Java Native SDK を使用して LindormTSDB に接続する前に、SDK をインストールする必要があります。 このトピックでは、バージョン 1.0.0 を例として使用します。 Java Native SDK は、次の 3 つの方法のいずれかでインストールできます。
方法 1 (推奨): LindormTSDB SDK for Java を Maven プロジェクトにインポートします。 次の依存関係を pom.xml ファイルの
dependenciesセクションに追加します。<dependency> <groupId>com.aliyun.lindorm</groupId> <artifactId>lindorm-tsdb-client</artifactId> <version>1.0.4</version> </dependency>説明LindormTSDB Java SDK は、Maven ベースのサンプルプロジェクトを提供します。 サンプルプロジェクトをダウンロードしてローカルでコンパイルおよび実行するか、それをベースに独自のプロジェクトを開発することができます。
JAR パッケージを Eclipse プロジェクトにインポートします。
Java SDK パッケージをダウンロードします。
ダウンロードした Java SDK パッケージを解凍します。
解凍した JAR パッケージを Eclipse プロジェクトに追加します。
Eclipse でプロジェクトを開き、プロジェクトを右クリックして [プロパティ] を選択します。
表示されるダイアログボックスで、 をクリックし、解凍した lindorm-tsdb-client-1.0.0.jar ファイルと lib ディレクトリ内の JAR パッケージを選択します。
[適用して閉じる] をクリックします。
JAR パッケージを IntelliJ IDEA プロジェクトにインポートします。
Java SDK パッケージをダウンロードします。
ダウンロードした Java SDK パッケージを解凍します。
解凍した JAR パッケージを IntelliJ IDEA プロジェクトに追加します。
IntelliJ IDEA でプロジェクトを開き、メニューバーで をクリックします。
[プロジェクト構造] ダイアログボックスの左側のナビゲーションウィンドウで、 を選択します。
ペインの右側で
をクリックし、[JAR またはディレクトリ] を選択します。表示されるダイアログボックスで、解凍した lindorm-tsdb-client-1.0.0.jar ファイルと lib ディレクトリ内の JAR パッケージを選択し、[OK] をクリックします。
[適用] をクリックします。
[OK] をクリックします。
LindormTSDB 用の Java Native SDK のすべてのバージョンは、Maven 中央リポジトリから入手できます。 詳細については、「Maven リポジトリ」をご参照ください。
LindormTSDB 用の Java Native SDK のバージョンの詳細については、「バージョンガイド」をご参照ください。
手順
データベースインスタンスを作成します。 LindormTSDBClient を作成するときは、LindormTSDB エンドポイントを指定する必要があります。
String url = "http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242"; // LindormTSDBClient はスレッドセーフであり、再利用できます。 頻繁に作成および破棄する必要はありません。 ClientOptions options = ClientOptions.newBuilder(url).build(); LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);demo という名前のデータベースと sensor という名前の時系列テーブルを作成します。 データベースと時系列テーブルの作成に使用される SQL 文の詳細については、「CREATE DATABASE」および「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))");テーブルにデータを書き込みます。
説明デフォルトでは、LindormTSDBClient は、データ書き込みパフォーマンスを向上させるために、バッチで非同期にデータを書き込みます。 データを同期的に書き込むには、
write()メソッドによって返されるCompletableFuture<WriteResult>オブジェクトのjoin()メソッドを呼び出します。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); // 非同期書き込み結果を処理します future.whenComplete((r, ex) -> { // 書き込みの失敗を処理します if (ex != null) { System.out.println("Failed to write."); if (ex instanceof LindormTSDBException) { LindormTSDBException e = (LindormTSDBException) ex; System.out.println("Caught an LindormTSDBException, which means your request made it to Lindorm TSDB, " + "but was rejected with an error response for some reason."); System.out.println("Error Code: " + e.getCode()); System.out.println("SQL State: " + e.getSqlstate()); System.out.println("Error Message: " + e.getMessage()); } else { ex.printStackTrace(); } } else { System.out.println("Write successfully."); } }); // これは、同期モードで書き込み結果を単純に処理する方法の例です。 System.out.println(future.join());時系列テーブルからデータをクエリします。 SQL クエリ文の詳細については、「基本的なクエリ」をご参照ください。
String sql = "select * from sensor limit 10"; ResultSet resultSet = lindormTSDBClient.query("demo", sql); try { // クエリ結果を処理します QueryResult result = null; // クエリ結果はバッチで返されます。 デフォルトでは、各バッチには 1,000 行が含まれます。 // resultSet の next() メソッドが null を返した場合、すべてのクエリ結果が読み取られます。 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 { // クエリが完了したら、必ず ResultSet の close メソッドを呼び出して I/O リソースを解放してください。 resultSet.close(); }
完全なコード例
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. クライアントインスタンスを作成します。
String url = "http://ld-xxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242";
// LindormTSDBClient はスレッドセーフであり、再利用できます。 頻繁に作成および破棄する必要はありません。
ClientOptions options = ClientOptions.newBuilder(url).build();
LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);
// 2. demo という名前のデータベースと 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. データを書き込みます。
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);
// 非同期書き込み結果を処理します。
future.whenComplete((r, ex) -> {
// 書き込みの失敗を処理します。
if (ex != null) {
System.out.println("Failed to write.");
Throwable throwable = ExceptionUtils.getRootCause(ex);
if (throwable instanceof LindormTSDBException) {
LindormTSDBException e = (LindormTSDBException) throwable;
System.out.println("Caught an LindormTSDBException, which means your request made it to Lindorm TSDB, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Code: " + e.getCode());
System.out.println("SQL State: " + e.getSqlstate());
System.out.println("Error Message: " + e.getMessage());
} else {
throwable.printStackTrace();
}
} else {
System.out.println("Write successfully.");
}
});
// これは、単純な同期待機の例です。
System.out.println(future.join());
// 4. データをクエリします。
String sql = "select * from sensor limit 10";
ResultSet resultSet = lindormTSDBClient.query("demo", sql);
try {
// クエリ結果を処理します。
QueryResult result = null;
// クエリ結果はバッチで返されます。 デフォルトでは、各バッチには 1,000 行が含まれます。
// resultSet の next() メソッドが null を返した場合、すべてのクエリ結果が読み取られます。
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 {
// クエリが完了したら、必ず ResultSet の close メソッドを呼び出して I/O リソースを解放してください。
resultSet.close();
}
lindormTSDBClient.shutdown();
}
}