MySQL の Java Database Connectivity (JDBC) ドライバーを使用して AnalyticDB for MySQL クラスターに接続します。
前提条件
開始する前に、以下をご準備ください。
-
データベースとアカウント (特権アカウントまたは標準アカウント) が設定された AnalyticDB for MySQL クラスター
-
AnalyticDB for MySQL コンソールの[クラスター情報]ページで確認できるクラスターエンドポイントとポート (デフォルト:
3306)
ドライバーの依存関係の追加
JAR (mysql-connector-java-x.x.x.jar) をダウンロードし、CLASSPATH に追加します。
サポートされているドライバーのバージョン
AnalyticDB for MySQL は、以下のバージョンの MySQL JDBC ドライバーをサポートしています:
-
5.0 シリーズ:5.0.2、5.0.3、5.0.4、5.0.5、5.0.7、および 5.0.8
-
5.1 シリーズ:5.1.1、5.1.2、5.1.3、5.1.4、5.1.5、5.1.6、5.1.7、5.1.8、5.1.11、5.1.12、5.1.13、5.1.14、5.1.15、5.1.16、5.1.17、5.1.18、5.1.19、5.1.20、5.1.21、5.1.22、5.1.23、5.1.24、5.1.25、5.1.26、5.1.27、5.1.28、5.1.29、5.1.31、5.1.32、5.1.33、および 5.1.34
-
8.0 シリーズ:すべてのバージョン
接続 URL の形式
jdbc:mysql://<endpoint>:<port>/<db_name>?useUnicode=true&characterEncoding=UTF-8
| プレースホルダー | 説明 | 例 |
|---|---|---|
<endpoint> |
[Cluster Information] ページで確認できるクラスターのエンドポイント | am-xxx.ads.aliyuncs.com |
<port> |
ポート番号 | 3306 (デフォルト) |
<db_name> |
データベース名 | mydb |
リトライなしでの接続
try-with-resources を使用して、接続、ステートメント、および結果セットを自動的にクローズします:
String url = "jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8";
Properties props = new Properties();
props.put("user", "<account_name>"); // 特権アカウントまたは標準アカウント
props.put("password", "<account_password>");
Class.forName("com.mysql.jdbc.Driver");
try (Connection conn = DriverManager.getConnection(url, props);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM information_schema.tables")) {
while (rs.next()) {
System.out.println(rs.getObject(1));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
<endpoint>、<db_name>、<account_name>、および <account_password> を実際の値に置き換えてください。
リトライありでの接続
本番環境で使用する場合は、一時的な接続障害を処理するためのリトライロジックを実装してください:
public static final int MAX_QUERY_RETRY_TIMES = 3;
public static Connection conn = null;
public static Statement statement = null;
public static ResultSet rs = null;
public static void main(String[] args) throws ClassNotFoundException {
String yourDB = "<db_name>";
String username = "<account_name>";
String password = "<account_password>";
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://<endpoint>:3306/" + yourDB + "?useUnicode=true&characterEncoding=UTF-8";
Properties connectionProps = new Properties();
connectionProps.put("user", username);
connectionProps.put("password", password);
String query = "SELECT id FROM test4dmp.test LIMIT 10";
int retryTimes = 0;
// 失敗した場合、MAX_QUERY_RETRY_TIMES 回までリトライします
while (retryTimes < MAX_QUERY_RETRY_TIMES) {
try {
getConn(url, connectionProps);
execQuery(query);
break; // クエリが成功したため、ループを終了します
} catch (SQLException e) {
System.out.println("SQL exception: " + e.getMessage() + ". Retrying...");
try {
if (conn == null || conn.isClosed()) {
retryTimes++;
}
} catch (SQLException e1) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
}
}
}
closeResource();
}
/** 接続を開きます。 */
public static void getConn(String url, Properties connectionProps) throws SQLException {
conn = DriverManager.getConnection(url, connectionProps);
}
/** クエリを10回実行し、実行ごとの経過時間と行数を出力します。 */
public static void execQuery(String sql) throws SQLException {
Statement statement = null;
ResultSet rs = null;
statement = conn.createStatement();
for (int i = 0; i < 10; i++) {
long startTs = System.currentTimeMillis();
rs = statement.executeQuery(sql);
int cnt = 0;
while (rs.next()) {
cnt++;
System.out.println(rs.getObject(1));
}
long endTs = System.currentTimeMillis();
System.out.println("Elapsed: " + (endTs - startTs) + " ms | Rows: " + cnt);
try {
Thread.sleep(160000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/** すべての接続リソースを解放します。 */
public static void closeResource() {
if (rs != null) {
try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (statement != null) {
try { statement.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
複数ステートメントの実行
複数の SQL ステートメントを連続して実行するには、実行前に複数ステートメント機能を有効にしてください:
SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
また、JDBC 接続 URL で allowMultiQueries=true を設定してください:
jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
複数ステートメントの実行には、AnalyticDB for MySQL V3.1.9.3 以降が必要です。
-
Data Lakehouse Edition クラスターのマイナーバージョンを確認するには、
SELECT adb_version();を実行します。クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。 -
Data Warehouse Edition クラスターのマイナーバージョンを表示または更新する方法については、「クラスターのマイナーバージョンを更新する」をご参照ください。
よくある質問
インターネットアクセスが有効で、パブリック IP アドレスに到達可能であるにもかかわらず、JDBC 接続に失敗します。
お使いのパブリック IP アドレスがクラスターのホワイトリストに登録されていない可能性があります。次のコマンドを実行してパブリック IP アドレスを取得し、クラスターの IP アドレスホワイトリスト に追加してください。
curl ipinfo.io/ip
JDBC 接続を確立した後に "MySQL server has gone away" というエラーが表示されるのはなぜですか。
このエラーは通常、接続アイドルタイムアウトまたはネットワーク中断が原因で発生します。インスタンスのサブスクリプションの有効期限とは関係ありません。
アプリケーションで長時間実行される接続を維持する必要がある場合は、コードに接続リトライメカニズムを追加してください。実装例については、このドキュメントの「リトライありでの接続」セクションをご参照ください。