このトピックでは、Druid接続プールを使用してLindormTSDBに接続する方法について説明します。
背景情報
Javaを使用してLindormTSDBにデータを格納するアプリケーションを開発する場合、JDBCドライバを使用してLindormTSDBに接続するようにアプリケーションを構成することをお勧めします。この場合、LindormTSDBに接続するためにConnectionオブジェクトが作成されます。LindormTSDBに接続するたびに新しいConnectionオブジェクトが作成される場合、大量のリソースが必要になります。接続に必要なリソースを削減するために、接続プールを使用して接続を作成および管理できます。
前提条件
Java Development Kit(JDK) 1.8以降がインストールされている。
クライアントのIPアドレスがLindormインスタンスのホワイトリストに追加されている。詳細については、「ホワイトリストを構成する」をご参照ください。
手順
このトピックでは、オープンソースの接続プールAlibaba Druidを例として使用します。Alibaba Druidをダウンロードするには、GitHub にアクセスしてください。
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です。
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>次のいずれかの方法を使用して、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 のバージョンを指定します。
Druidのパラメータ構成を読み込み、接続プールを初期化します。
// パラメータ構成を読み込みます。 Properties properties = new Properties(); InputStream inputStream = tsdb.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(inputStream); // 接続プールを初期化します。 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);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); } } } }