すべてのプロダクト
Search
ドキュメントセンター

Lindorm:チュートリアル:Druid接続プールを使用してLindormTSDBに接続する

最終更新日:Jan 14, 2025

このトピックでは、Druid接続プールを使用してLindormTSDBに接続する方法について説明します。

背景情報

Javaを使用してLindormTSDBにデータを格納するアプリケーションを開発する場合、JDBCドライバを使用してLindormTSDBに接続するようにアプリケーションを構成することをお勧めします。この場合、LindormTSDBに接続するためにConnectionオブジェクトが作成されます。LindormTSDBに接続するたびに新しいConnectionオブジェクトが作成される場合、大量のリソースが必要になります。接続に必要なリソースを削減するために、接続プールを使用して接続を作成および管理できます。

前提条件

  • Java Development Kit(JDK) 1.8以降がインストールされている。

  • クライアントのIPアドレスがLindormインスタンスのホワイトリストに追加されている。詳細については、「ホワイトリストを構成する」をご参照ください。

手順

このトピックでは、オープンソースの接続プールAlibaba Druidを例として使用します。Alibaba Druidをダウンロードするには、GitHub にアクセスしてください。

  1. Druidのパラメータを構成します。Mavenプロジェクトの src/main/resources パスに、druid.properties ファイルを作成し、次の構成をファイルに追加します。

    # ドライバークラスの名前を指定します。この構成は変更せずに使用できます。
    driverClassName=com.aliyun.lindorm.table.client.Driver
    # url、username、passwordパラメータを実際のビジネスの値に置き換えることができます。これらのパラメータの値は、Lindormコンソールで取得できます。
    url=jdbc:lindorm:tsdb:url=http://ld-bp12pt80qr38p****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242
    username=root
    password=root
    # ****を接続するデータベースに置き換えます。
    connectionProperties=database=default
    
    # 接続プールを初期化して接続を作成します。この構成は変更せずに使用することをお勧めします。
    init=true
    # 初期化中に作成する接続数を指定します。このパラメータは、要件に基づいて構成できます。
    initialSize=10
    # 接続プール内のアイドル接続の最小数を指定します。このパラメータは、要件に基づいて構成できます。
    minIdle=10
    # 接続プール内のアイドル接続の最大数を指定します。このパラメータは、要件に基づいて構成できます。
    maxActive=20
    # クライアントが接続を取得するために待機できる最大時間を指定します。単位:ミリ秒。この構成は変更せずに使用することをお勧めします。
    maxWait=30000
    
    # 接続キープアライブに関連するパラメータを構成します。これらの構成は変更せずに使用することをお勧めします。変更すると、接続が予期せず切断される可能性があります。
    # この場合、ConnectionDisconnectedException例外が報告されます。
    druid.keepAlive=true
    druid.keepAliveBetweenTimeMillis=30000
    minEvictableIdleTimeMillis=600000
    maxEvictableIdleTimeMillis=900000
    timeBetweenEvictionRunsMillis=5000
    
    # 接続の検証に必要なパラメータを構成します。これらの構成は変更せずに使用することをお勧めします。
    validationQuery=SELECT 1
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    
    # キャッシュに関連するパラメータを構成します。この例では、キャッシュは無効になっています。これらの構成は変更せずに使用することをお勧めします。
    # そうしないと、NoSuchStatement例外が報告される可能性があります。
    poolPreparedStatements=false
    maxOpenPreparedStatements=-1
    druid.maxPoolPreparedStatementPerConnectionSize=-1
    説明
    • url パラメータを、LindormTSDBへの接続に使用するJDBC URLに設定します。URLのパラメータの詳細については、「JDBC ドライバーの URL」をご参照ください。

    • ユーザーとパスワードのパラメータのデフォルト値は、root です。

  2. Alibaba Druidの依存関係をMavenプロジェクトに追加します。クライアントを起動し、Mavenプロジェクトを作成し、次の依存関係を pom.xml ファイルに追加します。次のコードは、LindormTable SQL の Java API 操作を呼び出して Lindorm ワイドテーブルにアクセスする方法の例を示しています。

    <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.2.6</version>
        </dependency>
  3. 次のいずれかの方法を使用して、Lindorm 用の JDBC ドライバーをインストールできます。

    • JDBCドライバーを手動でインストールする

      Lindorm-all-client JARパッケージをクライアントにダウンロードし、JDBCドライバーをインストールします。インストールする JDBC ドライバーのバージョンを選択できます。たとえば、JDBC ドライバー 2.1.5 をインストールする場合は、lindorm-all-client-2.1.5.jar パッケージをダウンロードします。

    • Mavenを使用してJDBCドライバーをダウンロードする

      JDBCドライバーをMavenプロジェクトに統合するには、Mavenプロジェクトを作成し、次の依存関係を pom.xml ファイルに追加します。

      <dependency>
          <groupId>com.aliyun.lindorm</groupId>  
          <artifactId>lindorm-all-client</artifactId>
          <version>2.2.1.3</version>
      </dependency>
      説明

      ビジネス要件に基づいて lindorm-all-client のバージョンを指定します。

  4. Druidのパラメータ構成を読み込み、接続プールを初期化します。

    // パラメータ構成を読み込みます。
    Properties properties = new Properties();
    InputStream inputStream = tsdb.class.getClassLoader().getResourceAsStream("druid.properties");
    properties.load(inputStream);
    // 接続プールを初期化します。
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  5. Druidを使用してJDBCから接続情報を取得し、LindormTSDBに接続します。

    // テーブルを作成します。
    try (Connection connection = dataSource.getConnection()) {
      try (Statement statement = connection.createStatement()) {
          String sql = "CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time TIMESTAMP,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))";
          int ret = statement.executeUpdate(sql);
          System.out.println(ret);
       }
    }
    // テーブルにデータを挿入します。
    try (Connection connection = dataSource.getConnection()) {
      try (Statement stmt = connection.createStatement()) {
         stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:00',12.1,45)");
         stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:10',13.2,47)");
         stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:20',10.6,46)");
         stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn','2021-04-22 15:33:00',18.1,44)");
         stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn','2021-04-22 15:33:10',19.7,44)");
         stmt.executeBatch();
      }
    }
    // テーブル内のデータをクエリします。
    // パラメータを指定してデータをクエリします。
    // データをクエリします。スキャンされるデータ量を減らすために、時間範囲を指定することをお勧めします。
    try (Connection connection = dataSource.getConnection()) {
        try (PreparedStatement pstmt = connection.prepareStatement("SELECT device_id, region,time,temperature,humidity FROM sensor WHERE time >= ?  and time <= ?")) {
            Timestamp startTime = Timestamp.valueOf("2021-04-22 15:33:00");
            Timestamp endTime = Timestamp.valueOf("2021-04-22 15:33:20");
            pstmt.setTimestamp(1, startTime);
            pstmt.setTimestamp(2, endTime);
    
        try (ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                String device_id = rs.getString("device_id");
                String region = rs.getString("region");
                Timestamp time = rs.getTimestamp("time");
                Double temperature = rs.getDouble("temperature");
                Double humidity = rs.getDouble("humidity");
                System.out.printf("%s %s %s %f %f\n", device_id, region, time, temperature, humidity);
             }
        }
      }
    }

サンプルコード

完全なサンプルを表示するには、ここをクリックしてください

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class tsdb{
    public static void main(String[] args) throws Exception {
        // パラメータ構成を読み込みます。
        Properties properties = new Properties();
        InputStream inputStream = tsdb.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(inputStream);
        // 接続プールを初期化します。
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);


        // テーブルを作成します。
        try (Connection connection = dataSource.getConnection()) {
            try (Statement statement = connection.createStatement()) {
                String sql = "CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time TIMESTAMP,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))";
                int ret = statement.executeUpdate(sql);
                System.out.println(ret);
            }
        }

        // テーブルにデータを挿入します。
        try (Connection connection = dataSource.getConnection()) {
            try (Statement stmt = connection.createStatement()) {
                stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:00',12.1,45)");
                stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:10',13.2,47)");
                stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:20',10.6,46)");
                stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn','2021-04-22 15:33:00',18.1,44)");
                stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn','2021-04-22 15:33:10',19.7,44)");
                stmt.executeBatch();
            }
        }

        // テーブル内のデータをクエリします。
        // パラメータを指定してデータをクエリします。
        // データをクエリします。スキャンされるデータ量を減らすために、時間範囲を指定することをお勧めします。
        try (Connection connection = dataSource.getConnection()) {
            try (PreparedStatement pstmt = connection.prepareStatement("SELECT device_id, region,time,temperature,humidity FROM sensor WHERE time >= ?  and time <= ?")) {
                Timestamp startTime = Timestamp.valueOf("2021-04-22 15:33:00");
                Timestamp endTime = Timestamp.valueOf("2021-04-22 15:33:20");
                pstmt.setTimestamp(1, startTime);
                pstmt.setTimestamp(2, endTime);


                //pstmt.setString(1, "2021-04-22 15:33:00");
               // pstmt.setString(2, "2021-04-22 15:33:20");
                try (ResultSet rs = pstmt.executeQuery()) {
                    while (rs.next()) {
                        String device_id = rs.getString("device_id");
                        String region = rs.getString("region");
                        Timestamp time = rs.getTimestamp("time");
                        Double temperature = rs.getDouble("temperature");
                        Double humidity = rs.getDouble("humidity");
                        System.out.printf("%s %s %s %f %f\n", device_id, region, time, temperature, humidity);
                    }
                }
            }
        }
    }
}

次のサンプルレスポンスが返された場合、実行は成功です。

0
F07A1260 north-cn 2021-04-22 15:33:00.0 12.100000 45.000000
F07A1260 north-cn 2021-04-22 15:33:10.0 13.200000 47.000000
F07A1260 north-cn 2021-04-22 15:33:20.0 10.600000 46.000000
F07A1261 south-cn 2021-04-22 15:33:00.0 18.100000 44.000000
F07A1261 south-cn 2021-04-22 15:33:10.0 19.700000 44.000000