Tablestore インスタンスに直接接続し、com.aliyun.openservices:tablestore-jdbc ドライバーを使用して標準の JDBC インターフェース経由で SQL クエリを実行します。
前提条件
AccessKey ペア (RAM ユーザーには
"Action": "ots:SQL*"権限が必要です)データテーブルとそのマッピングテーブル (DDL 操作)
ステップ 1: JDBC ドライバーのインストール
ドライバーは、Maven 依存関係またはスタンドアロンの JAR として利用できます。
Maven 依存関係
Maven の pom.xml の <dependencies> セクションに Tablestore JDBC ドライバーの依存関係を追加します。次の例ではバージョン 5.17.0 を使用します。
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore-jdbc</artifactId>
<version>5.17.0</version>
</dependency>
手動インストール
Tablestore JDBC ドライバーをダウンロードし、プロジェクトにインポートします。
ステップ 2: JDBC 直接接続の使用
ドライバーをロードし、インスタンスに接続してから、SQL ステートメントを実行します。
-
Class.forName()を使用して Tablestore JDBC ドライバーをロードします。ドライバーのクラス名は
com.alicloud.openservices.tablestore.jdbc.OTSDriverです。Class.forName("com.alicloud.openservices.tablestore.jdbc.OTSDriver"); -
JDBC を使用して Tablestore インスタンスに接続します。
String url = "jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance"; String user = "************************"; String password = "********************************"; Connection conn = DriverManager.getConnection(url, user, password);接続パラメーターについては、次の表で説明します。
パラメーター
説明
url
Tablestore JDBC の URL です。形式:
jdbc:ots:schema://[accessKeyId:accessKeySecret@]endpoint/instanceName[?param1=value1&...¶mN=valueN]。URL の各フィールドは次のとおりです。-
schema (必須):プロトコルです。https に設定します。 -
accessKeyId:accessKeySecret (オプション):Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID と AccessKey Secret。 -
endpoint (必須):インスタンスのエンドポイント。 -
instanceName (必須):インスタンスの名前。
その他の設定項目については、「設定」をご参照ください。
user
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。
password
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。
URL または Properties オブジェクトを介して AccessKey ペアと設定を渡します。次の例では、インターネット経由で China (Hangzhou) リージョンの myinstance インスタンスに接続します。
URL
DriverManager.getConnection("jdbc:ots:https://************************:********************************@myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance?enableRequestCompression=true");Properties
Properties info = new Properties(); info.setProperty("user", "************************"); info.setProperty("password", "********************************"); info.setProperty("enableRequestCompression", "true"); DriverManager.getConnection("jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance", info); -
-
SQL ステートメントを実行します。
createStatementまたはprepareStatementを使用してクエリを実行します。createStatement
String sql = "SELECT pk1, col_a FROM test_table"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString("pk1") + ", " + rs.getLong("col_a")); } rs.close(); stmt.close();prepareStatement
String sql = "SELECT * FROM test_table WHERE pk = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setLong(1, 1); ResultSet rs = stmt.executeQuery(); ResultSetMetaData meta = rs.getMetaData(); while (rs.next()) { for (int i = 1; i <= meta.getColumnCount(); i++) { System.out.println(meta.getColumnName(i) + " = " + rs.getString(i)); } } rs.close(); stmt.close();
完全な例
次の例では、Tablestore インスタンスの
public class Demo {
public static void main(String[] args) throws Exception {
Class.forName("com.alicloud.openservices.tablestore.jdbc.OTSDriver");
String url = "jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance";
String user = "************************";
String password = "********************************";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test_table");
ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= colCount; i++) {
System.out.print(meta.getColumnName(i) + "=" + rs.getString(i) + "\t");
}
System.out.println();
}
rs.close();
stmt.close();
conn.close();
}
}
設定
Tablestore JDBC ドライバーは Java SDK に基づいて構築されており、URL パラメーターまたは Properties を使用して設定できます。
SQL リクエストのサーバー側タイムアウトは 30 秒です。より短いタイムアウトを設定するには、
|
パラメーター |
デフォルト |
説明 |
|
enableRequestCompression |
false |
リクエストデータを圧縮するかどうかを指定します。 |
|
enableResponseCompression |
false |
レスポンスデータを圧縮するかどうかを指定します。 |
|
ioThreadCount |
2 |
|
|
maxConnections |
300 |
HTTP 接続の最大数です。 |
|
socketTimeoutInMillisecond |
30000 |
ソケット層でのデータ転送のタイムアウト (単位:ミリ秒) です。値 0 はタイムアウトがないことを示します。 |
|
connectionTimeoutInMillisecond |
30000 |
接続確立のタイムアウト (単位:ミリ秒) です。値 0 はタイムアウトがないことを示します。 |
|
retryThreadCount |
1 |
リトライのスレッドプール内のスレッド数です。 |
|
syncClientWaitFutureTimeoutInMillis |
-1 |
非同期の待機のタイムアウト (単位:ミリ秒) です。 |
|
connectionRequestTimeoutInMillisecond |
60000 |
リクエスト送信のタイムアウト (単位:ミリ秒) です。 |
|
retryStrategy |
default |
リトライポリシーです。有効な値:
|
|
retryTimeout |
10 |
リトライのタイムアウト値と時間単位です。有効な時間単位:
|
|
retryTimeoutUnit |
seconds |
データ型変換
Tablestore は、
Java から Tablestore への変換
PreparedStatement で SQL パラメーターを設定する際、ドライバーは
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM t WHERE pk = ?");
stmt.setLong(1, 1); // サポート対象
stmt.setURL(1, new URL("https://aliyun.com/")); // サポート対象外 — 例外がスローされます
Tablestore から Java への変換
ResultSet から結果を読み取る際、JDBC ドライバーは次のルールに従ってデータ型を自動的に変換します。
|
Tablestore 型 |
変換ルール |
|
Integer |
|
|
Double |
|
|
String |
|
|
Binary |
|
|
Boolean |
|
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT count(*) FROM t");
while (rs.next()) {
rs.getLong(1); // サポート対象
rs.getCharacterStream(1); // サポート対象外 — 例外がスローされます
}
Tablestore データ型と Java 型との間でサポートされている変換を次の表に示します。
「✓」は通常の変換、「~」は例外が発生する可能性がある変換、「×」はサポート対象外の変換を示します。
|
型 |
Integer |
Double |
String |
Binary |
Boolean |
|
Byte |
~ |
~ |
~ |
~ |
✓ |
|
Short |
~ |
~ |
~ |
~ |
✓ |
|
Int |
~ |
~ |
~ |
~ |
✓ |
|
Long |
✓ |
~ |
~ |
~ |
✓ |
|
BigDecimal |
✓ |
✓ |
~ |
~ |
✓ |
|
Float |
✓ |
✓ |
~ |
~ |
✓ |
|
Double |
✓ |
✓ |
~ |
~ |
✓ |
|
String |
✓ |
✓ |
✓ |
✓ |
✓ |
|
CharacterStream |
× |
× |
✓ |
✓ |
× |
|
Bytes |
✓ |
✓ |
✓ |
✓ |
✓ |
|
Boolean |
✓ |
✓ |
✓ |
✓ |
✓ |