このトピックでは、Lindorm Java Database Connectivity(JDBC)ドライバーを使用して LindormTSDB に接続し、使用する方法について説明します。 また、JDBC ドライバーを使用して LindormTSDB にアクセスする際に呼び出すことができる API 操作とメソッドについても説明します。
背景情報
LindormTSDB の JDBC ドライバーは、JDBC 4.1 仕様に基づいて指定された API 操作に準拠しています。 LindormTSDB は時系列データベースでもあります。 したがって、JDBC ドライバーによって提供される API 操作機能は、JDBC 1.0 仕様に基づいて指定された基本機能セットのサブセットです。
前提条件
Java Development Kit(JDK)1.8 以降がインストールされている。
クライアントの IP アドレスが Lindorm インスタンスのホワイトリストに追加されている。 詳細については、「ホワイトリストの設定」をご参照ください。
LindormTSDB のエンドポイントが取得されている。 詳細については、「エンドポイントの表示」をご参照ください。
手順
次のいずれかの方法を使用して、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.0</version> </dependency>説明要件に基づいて lindorm-all-client のバージョン番号を指定します。
LindormTSDB にアクセスします。 完全なサンプルコードについては、「例セクションのサンプルコード」をご参照ください。
LindormTSDB とクライアント間の接続を確立します。
String url = "jdbc:lindorm:tsdb:url=http://<host:port>"; Connection conn = DriverManager.getConnection(url);説明host:port: LindormTSDB への接続に使用するエンドポイントとポートを指定します(例:ld-bp17j28j2y7pm****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242)。jdbc:lindorm:tsdb:url=http://<host:port>: JDBC ドライバーの URL を指定します。 構文と接続パラメーターについては、「JDBC ドライバーの URL」をご参照ください。
Lindorm 時系列データベースとテーブルを作成します。
Statement stmt = conn.createStatement(); stmt.execute("CREATE DATABASE test"); stmt.execute("USE test"); stmt.execute("CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time TIMESTAMP,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))");sensor テーブルにデータを挿入します。
// PreparedStatement を使用して複数の行のデータをバッチで書き込みます。(推奨) PreparedStatement pstmt = conn.prepareStatement("INSERT INTO sensor (device_id, region, time, temperature, humidity) VALUES (?, ?, ?, ?, ?)"); int batchSize = 100; long ts = System.currentTimeMillis(); for (int i = 0; i < batchSize; i++) { // INSERT ステートメントで列パラメーターが指定されている順序で、列のパラメーターを指定します。 pstmt.setString(1, "F07A1260"); pstmt.setString(2, "north-cn"); pstmt.setLong(3, ts + i * 10000); pstmt.setDouble(4, 12.1); pstmt.setLong(5, 45); pstmt.addBatch(); } pstmt.executeBatch(); pstmt.clearBatch(); // 複数の行のデータをバッチで書き込みます。 Statement stmt = conn.createStatement(); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076780000,12.1,45)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076790000,13.2,47)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076800000,10.6,46)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn',1619076780000,18.1,44)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn',1619076790000,19.7,44)"); stmt.executeBatch(); stmt.clearBatch(); // 単一行のデータを書き込みます。(非推奨) Statement stmt = conn.createStatement(); stmt.execute("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076780000,12.1,45)");sensor テーブルのデータをクエリします。
ResultSet rs = stmt.executeQuery("select device_id, region,time,temperature,humidity from sensor where time >= 1619076780000 and time <= 1619076800000"); while (rs.next()) { String device_id = rs.getString("device_id"); String region = rs.getString("region"); Long time = rs.getLong("time"); Double temperature = rs.getDouble("temperature"); Long humidity = rs.getLong("humidity"); System.out.printf("%s %s %d %f %d\n", device_id, region, time, temperature, humidity); }
サポートされている API 操作とメソッド
次の表に、JDBC ドライバーを使用して LindormTSDB にアクセスする際にサポートされている API 操作とメソッドを示します。
次の表に記載されていない API 操作は、LindormTSDB の機能に基づいて呼び出されます。 これらの API 操作については、チケットを送信してください。 その他の問題が発生した場合は、チケットを送信してください。
API 操作 | サポートされているメソッド |
Connection |
説明 Lindorm JDBC ドライバーの Connection 操作の実装はスレッドセーフではありません。 複数のスレッドで同じ Connection オブジェクトを使用しないことをお勧めします。 |
Statement |
|
ResultSet |
|
PreparedStatement |
|
JDBC ドライバーの URL
JDBC ドライバーの URL は、アプリケーションが Connection 操作を呼び出してデータベース接続を確立する際に重要です。 通常、JDBC ドライバーの URL は、データベース接続のプロトコルを指定するために使用されます。 LindormTSDB は、JDBC ドライバーを使用して接続されます。
次のサンプルコードは、JDBC ドライバーの URL の構文の例を示しています。
jdbc:lindorm:tsdb:url=http://${host:port}[;${connection_parameter}=${connection_value}]...host:port: LindormTSDB への接続に使用するエンドポイントとポートを指定します(例:ld-bp17j28j2y7pm****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242)。
次の表に、JDBC ドライバーの URL でサポートされている接続パラメーターを示します。
パラメーター | 説明 |
user | Lindorm インスタンスのユーザー名。 ユーザー名が LindormTSDB にアクセスする際のユーザー認証に使用されます。 説明 LindormTSDB でユーザー認証機能が有効になっていない場合は、ユーザー名を指定する必要はありません。 |
password | ユーザー名に対応するパスワード。 パスワードは、ユーザーが LindormTSDB にアクセスする際のユーザー認証に使用されます。 パスワードを忘れた場合は、LindormTable の Lindorm Insight コンソールでパスワードを変更できます。 詳細については、「パスワードの変更」をご参照ください。 説明 LindormTSDB でユーザー認証機能が有効になっていない場合は、パスワードを指定する必要はありません。 |
database | アクセスするデータベース。 このパラメーターを指定しない場合、デフォルトで |
lindorm.tsdb.driver.connect.timeout | LindormTSDB のサーバーへの接続のタイムアウト期間。 単位:ミリ秒。 デフォルト値は 60,000 ミリ秒(60 秒)です。 |
lindorm.tsdb.driver.socket.timeout | ソケットへのデータの読み取りまたは書き込みが 2 回行われる間のタイムアウト期間。 単位:ミリ秒。 デフォルト値:-1。 デフォルト値は、ソケットへのデータの読み取りまたは書き込みが 2 回行われる間のタイムアウトがないことを指定します。 |
リソース使用率を向上させるため、LindormTSDB のサーバーは、接続が 60 秒間アイドル状態になった後、LindormTSDB のクライアントへの接続を積極的に閉じます。 接続が閉じられた後に接続を使用すると、com.aliyun.lindorm.client.shaded.org.apache.calcite.avatica.http.ConnectionDisconnectedException エラーが報告されます。 この問題を解決するには、新しい接続を確立します。
接続プール Alibaba Druid を使用して LindormTSDB にアクセスする
LindormTSDB にデータを格納するアプリケーションを Java で開発する場合は、JDBC ドライバーを使用して LindormTSDB に接続するようにアプリケーションを設定することをお勧めします。 JDBC ドライバーを使用して LindormTSDB に接続する場合は、Connection オブジェクトを作成する必要があります。 LindormTSDB に接続するたびに新しい Connection オブジェクトが作成される場合、リソースのオーバーヘッドが高くなります。 リソースのオーバーヘッドを削減するには、接続プールを使用して接続を作成および管理します。
さまざまな接続プールを使用できます。 次のセクションでは、オープンソースの接続プール Alibaba Druid を使用する方法について説明します。
接続プール Alibaba Druid の依存関係を Maven プロジェクトに追加します。 クライアントを起動し、プロジェクトを作成し、pom.xml ファイルで Maven 依存関係を設定します。 次のサンプルコードは、依存関係の詳細を示しています。
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency>Lindorm JDBC ドライバーの依存関係を Maven プロジェクトに追加します。 詳細については、「手順」セクションの手順 1 を参照してください。
次のコードを実行して DataSource オブジェクトを作成し、DataSource オブジェクトに LindormTSDB の JDBC ドライバーの URL を指定します。
dataSource = new DruidDataSource(); try { dataSource.setDriver(DriverManager.getDriver("jdbc:lindorm:tsdb:url=http://<host:port>")); } catch (SQLException throwables) { throwables.printStackTrace(); }説明host:port: LindormTSDB への接続に使用するエンドポイントとポートを指定します(例:ld-bp17j28j2y7pm****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242)。DataSource オブジェクトに基づいて JDBC 接続を確立し、LindormTSDB にアクセスします。 次のセクションでは、完全なサンプルコードを示します。
import com.alibaba.druid.pool.DruidDataSource; import java.sql.*; public class App { private DruidDataSource dataSource; public void setUp() { dataSource = new DruidDataSource(); try { dataSource.setDriver(DriverManager.getDriver("jdbc:lindorm:tsdb:url=http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242")); dataSource.setUrl("jdbc:lindorm:tsdb:url=http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242"); dataSource.setValidationQuery("select 1"); dataSource.setMaxActive(1); dataSource.setUsername("username"); dataSource.setPassword("****"); dataSource.setKeepAlive(true); dataSource.setMinEvictableIdleTimeMillis(80); dataSource.setMaxWait(10000); dataSource.init(); } catch (SQLException throwables) { throwables.printStackTrace(); } } public void close() { dataSource.close(); } public void testQuery() { try (Connection conn = this.dataSource.getConnection()) { try (Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery("select * from sensor"); long count = 0; while (rs.next()) { count++; } System.out.println("count=" + count + " "); } catch (RuntimeException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } catch (RuntimeException e) { System.out.println("connection failed."); e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static void main( String[] args ) { App app = new App(); app.setUp(); app.testQuery(); app.close(); } }