Apache IoTDBシリーズチュートリアル4:クライアントインターフェイス

文法や展開の運用や保守について長い間話していた後も、実際の使用はコードに当てはまる必要がありますが、本日はクライアントインターフェイスを紹介します。

本文は3516語で、推定読み上げ時間は5分です。

現在のクライアントとサーバーの通信は、クロス言語のRPCフレームワークThirftを使用しています。理論的には、Thriftが生成できるすべての言語でサポートできます。しかし、Thriftによって直接生成されたコードはデータベースユーザーにとってあまりフレンドリーではないため、生成されたコードに基づいてさまざまなクライアントインターフェイスをパッケージ化しました。次に、さまざまなクライアントインターフェイスを紹介します。

JDBCインターフェース

JDBCはリレーショナルデータベースの標準インターフェースであり、最もよく知られているインターフェースでもあります。そのため、最初からこのインターフェースを提供しました。

標準のJDBCと同様に、データベースドライバークラスをロードし、接続を確立し、ステートメントを確立し、ステートメントを介してステートメントを実行する必要があります。クエリ以外の場合は、バッチ実行を実行してネットワーク転送の数を減らすことができます。これは簡単な例です、

public static void main(String[] args) throws ClassNotFoundException, SQLException {
    Class.forName("org.apache.iotdb.jdbc.IoTDBDriver");
    try (Connection connection = DriverManager
        .getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
        Statement statement = connection.createStatement()) {
      // 创建存储组
      statement.execute("SET STORAGE GROUP TO root.sg1");
      // 创建时间序列
      statement.execute("CREATE TIMESERIES root.sg1.d1.s1 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY");
      statement.execute("CREATE TIMESERIES root.sg1.d1.s2 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY");
      statement.execute("CREATE TIMESERIES root.sg1.d1.s3 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY");
      // 在客户端积累一批更新语句
      for (int i = 0; i <= 100; i++) {
        statement.addBatch("insert into root.sg1.d1(timestamp, s1, s2, s3) values("+ i + "," + 1 + "," + 1 + "," + 1 + ")"); 
      }
      // 执行
      statement.executeBatch();
      statement.clearBatch();
      // 查询
      ResultSet resultSet = statement.executeQuery("select * from root where time <= 10");
      // 打印结果集
      ResultSetMetaData metaData = resultSet.getMetaData();
      int columnCount = metaData.getColumnCount();
      while (resultSet.next()) {
        for (int i = 1; i < columnCount; i++) {
          System.out.print(resultSet.getString(i));
          System.out.print(" ");
        }
        System.out.println();
      }
    }
  }

完全なサンプルコードの場所:

https://github.com/apache/incubator-iotdb/blob/master/example/jdbc/src/main/java/org/apache/iotdb/JDBCExample.java

Javaネイティブインターフェイスセッション

データの書き込みの場合、SQL解析は時間の70%を占めます。そのため、JDBCよりも効率的なネイティブNoSQLインターフェース(セッション)を提供しています。

insertRecord(String deviceId, long time, List<String> measurements,
      List<TSDataType> types, List<Object> values)

このインターフェイスは、一度に1つのデバイスの1つのタイムスタンプで複数の測定ポイントの値を書き込むことができる挿入ステートメントに対応しています。値の型は、登録されている型と一致している必要があります。登録されていない場合、この型は自動的に登録されます。

insertRecord(String deviceId, long time, List<String> measurements,
      List<String> values)

一部のシナリオでは、クライアントが特定のデータ型を取得できず、このStringパラメーターインターフェイスをこの時点で使用できます。シーケンスが事前に登録されている場合、サーバーはこれらの文字列の値を登録されたタイプに従って解析し、登録されていない場合は、値のフォーマットに従ってタイプを推測して登録します。

insertTablet(Tablet tablet, boolean sorted)

タブレットは、デバイスの複数のタイムスタンプと複数の測定ポイントの値です。ここで、各測定ポイントには各タイムスタンプの値が必要であり、空の値は存在しないことに注意してください。sortedは、タイムスタンプがインクリメントされるかどうかを示します。インクリメントされることが保証できる場合は、trueに設定できます。それ以外の場合は、再度ソートします。

実行時間のみを計算する場合、このインターフェースはプリミティブ配列を使用してボックス化を回避するため、最も効率的です。ただし、このインターフェイスにはデータの形式に関する高い要件があり、データコレクションが整列していない場合は、強制的にこのインターフェイスに変換されるため、時間のかかる変換をカウントする必要があります。

さらに、2つのタイプ、insertTabletsとinsertRecordsがあります。これらは、実際には上記のインターフェースのバッチ形式です。

セッションのクエリ結果セットはSessionDataSetです。この構造によって提供されるhasNextメソッドとnextメソッドは、データの各行をRowRecord構造に変換します。クライアントが他の変換を行う必要がある場合、この構造は冗長です。現時点では、SessionDataSet.iterator()を介してイテレータを取得できます。このイテレータは、JDBC ResultSetと同じ方法でデータにアクセスします。バイト配列から直接データを取得するため、RowRecordよりも効率的です。

完全なサンプルコードの場所:

https://github.com/apache/incubator-iotdb/blob/master/example/session/src/main/java/org/apache/iotdb/SessionExample.java

接続プールSessionPool

ネイティブインターフェースの誕生以来、多くのユーザーがJDBCから元のインターフェースに移行し、ネイティブインターフェースの機能を拡張し、セッションの接続プールを拡張しました(ドンゲの献身)。接続プールのインターフェースは基本的にセッションのインターフェースと同じですが、接続プールは複数のスレッドで使用でき、異常な接続などの問題を防ぐことができます。

接続プールを使用するときに注意すべき唯一のことは、クエリによって取得された結果セットは、使用後に接続プールに返す必要がある(接続プールのcloseResultSetメソッドを呼び出す)必要があることです。そうしないと、接続が占有され、新しい接続がタイムアウトとして報告されます。

SessionDataSetWrapper wrapper = null;
try {
  wrapper = pool.executeQueryStatement("select * from root.sg1.d1");
  while (wrapper.hasNext()) {
    System.out.println(wrapper.next());
  }
} catch (IoTDBConnectionException | StatementExecutionException e) {
  e.printStackTrace();
} finally {
  // remember to close data set finally!
  pool.closeResultSet(wrapper);
}

完全なサンプルコードの場所:

https://github.com/apache/incubator-iotdb/blob/master/example/session/src/main/java/org/apache/iotdb/SessionPoolExample.java

Pythonインターフェース

JAVAインターフェースに加えて、バージョン0.9以降に追加されたPythonインターフェースもラップしました。場所 

https://github.com/apache/incubator-iotdb/blob/master/client-py

総括する

今日は主にJDBCインターフェース、JAVAネイティブインターフェースセッション、接続プールを紹介しました。SessionPoolを使用してクエリを実行する場合、結果セットを手動で閉じる必要があるなど、いくつかの注意点があります(これには非常に感銘を受け、数日間ピットに足を踏み入れました)。

おすすめ

転載: blog.csdn.net/qiaojialin/article/details/106893861
おすすめ