Java DataBase Connectivity(JDBC)API は、データベースに接続して管理し、SQL 文を実行するために使用される標準の Java API です。 Java JDBC API を使用して LindormTable に接続し、Lindorm SQL に基づいてアプリケーションを開発できます。このトピックでは、Java JDBC API を使用して MySQL ベースのアプリケーションを開発する方法について説明します。
前提条件
インスタンスで MySQL 互換性機能が有効になっていること。詳細については、「MySQL 互換性機能を有効にする」をご参照ください。
Java 開発キット(JDK)V1.8 以降がインストールされていること。
クライアントの IP アドレスが Lindorm インスタンスのホワイトリストに追加されていること。詳細については、「ホワイトリストを設定する」をご参照ください。
手順
MySQL 用 JDBC ドライバーの依存関係を追加します。たとえば、Maven プロジェクトの
pom.xml
ファイルに次の依存関係を追加できます。<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> </dependency>
重要LindormTable に接続するには、バージョン 8.0 以降の MySQL 用 JDBC ドライバーを使用することをお勧めします。
MySQL 用 JDBC ドライバーを使用して接続を確立するには、ドライバーのパッケージ(
mysql-connector-java-x.x.x.jar
)を手動で CLASSPATH に追加する必要があります。そうしないと、接続を確立できません。
MySQL 用 JDBC クライアントを初期化し、クライアントとデータ間の接続を確立します。
Class.forName("com.mysql.cj.jdbc.Driver"); // Lindorm コンソールから取得したデータベースユーザー名。 String username = "root"; // Lindorm コンソールから取得したデータベースパスワード。 String password = "root"; // 接続を確立するときに、接続先のデータベースを指定できます。データベースを指定しない場合、クライアントは default という名前のデータベースに接続されます。 String database = "default"; // MySQL 用の LindormTable エンドポイントを指定します。 33060 は MySQL のポート番号であり、このパラメーターは変更せずに使用できます。 database パラメーターは、接続先のデータベースを指定します。パフォーマンスを向上させるために、他のパラメーターは変更しないことをお勧めします。 String url = "jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/" + database + "?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000"; Properties properties = new Properties(); properties.put("user", username); properties.put("password", password); // 確立された接続を取得します。 Connection connection = DriverManager.getConnection(url, properties);
パラメーター
パラメーター
説明
url
MySQL 用 JDBC クライアントが LindormTable に接続するために使用する URL。URL の形式は次のとおりです。
jdbc:mysql://<MySQL 用 LindormTable エンドポイント>/<データベース名>?<接続設定>
。URL にデータベース名を指定しない場合、クライアントはデフォルトデータベースに接続します。 [MySQL 用 LindormTable エンドポイント] の取得方法の詳細については、「エンドポイントを表示する」をご参照ください。
接続パラメーターを指定すると、パフォーマンスが向上する可能性があります。すべてのパラメーターを指定することをお勧めします。接続設定の詳細については、「接続設定」をご参照ください。
重要アプリケーションが ECS インスタンスにデプロイされている場合は、セキュリティを強化し、ネットワーク遅延を低減するために、VPC を使用して Lindorm インスタンスに接続することをお勧めします。
アプリケーションがローカルサーバーにデプロイされていて、インターネット経由で Lindorm インスタンスに接続する必要がある場合は、Lindorm コンソールでインスタンスのパブリックエンドポイントを有効にする必要があります。詳細については、「LindormTable のエンドポイントを表示する」をご参照ください。
VPC を使用して Lindorm インスタンスにアクセスする場合は、url の値に [MySQL 用 LindormTable VPC エンドポイント] を指定します。インターネットを使用して Lindorm インスタンスにアクセスする場合は、url の値に [MySQL 用 LindormTable インターネットエンドポイント] を指定します。
database
接続先のデータベースの名前。デフォルトでは、クライアントは default という名前のデータベースに接続されます。
username
LindormTable に接続するために使用するユーザー名とパスワード。
パスワードを忘れた場合は、LindormTable のクラスタ管理システムでパスワードを変更できます。詳細については、「ユーザーのパスワードを変更する」をご参照ください。
password
接続設定
パラメーター
例
説明
sslMode
disabled
暗号化接続を確立するために SSL を使用するかどうかを指定します。
disabled
に設定することをお勧めします。この場合、接続の確立時に SSL は使用されないため、システムのパフォーマンスが向上します。allowPublicKeyRetrieval
true
ユーザー認証中にサーバーから RSA 公開鍵を取得するかどうかを指定します。
true
に設定することをお勧めします。useServerPrepStmts
true
サーバーでプリプロセスされた文を使用するかどうかを指定します。
true
に設定することをお勧めします。この場合、データベースは組み込みの SQL プリプロセス機能を使用して、クエリのパフォーマンスを向上させ、SQL インジェクションのリスクを軽減できます。useLocalSessionState
true
クライアントとデータベースサーバー間のデータ転送の頻度を減らすために、ローカルセッションステータスを使用するかどうかを指定します。
true
に設定することをお勧めします。rewriteBatchedStatements
true
バッチ文を書き換えるかどうかを指定します。
true
に設定することをお勧めします。この場合、プリプロセスされた文を使用し、バッチでパラメーターを指定するアプリケーションの書き込みパフォーマンスが向上します。cachePrepStmts
true
プリプロセスされた文をキャッシュできるかどうかを指定します。プリプロセスされた文を作成する頻度を減らすために、
true
に設定することをお勧めします。この場合、頻繁に実行される文のクエリのパフォーマンスが向上する可能性があります。prepStmtCacheSize
100
キャッシュできるプリプロセスされた文の数を指定します。このパラメーターは、cachePrepStmts パラメーターが
true
に設定されている場合にのみ使用できます。説明prepStmtCacheSize に大きな値を指定すると、より多くのメモリリソースが消費されます。実際の要件に基づいてこのパラメーターを設定してください。
prepStmtCacheSqlLimit
500000
キャッシュできるプリプロセスされた文の最大長を指定します。指定された長さを超える SQL 文はキャッシュされません。ビジネスがパフォーマンス重視の場合は、このパラメーターを大きな値に設定することをお勧めします。
接続が確立されたら、SQL 構文を使用して LindormTable に接続し、使用します。次の例は、インデックスの最新の有効期間で更新されたデータをクエリする方法を示しています。
String tableName = "sql_table_" + new Random().nextInt(1000); // テーブルを作成します。 try (Statement statement = connection.createStatement()) { String sql = "create table if not exists " + tableName + "(id VARCHAR, name VARCHAR, primary key(id))"; int ret = statement.executeUpdate(sql); System.out.println(ret); } // テーブルにデータを挿入します。 String upsertSql = "insert into " + tableName + "(id,name) values(?,?)"; try (PreparedStatement ps = connection.prepareStatement(upsertSql)) { int batchSize = 100; for (int i = 0; i < batchSize; i++) { ps.setString(1, "aa" + i); ps.setString(2, "bb" + i); // 書き込み操作をバッチに追加します。 ps.addBatch(); } int[] ret = ps.executeBatch(); System.out.println(Arrays.toString(ret)); } // テーブル内のデータをクエリします。 String querySql = "select * from " + tableName + " where id=?"; try (PreparedStatement ps = connection.prepareStatement(querySql)) { ps.setString(1, "aa1"); ResultSet rs = ps.executeQuery(); while (rs.next()) { String id = rs.getString(1); String name = rs.getString(2); System.out.println("id=" + id); System.out.println("name=" + name); } } // テーブルからデータを削除します。 String deleteSql = "delete from " + tableName + " where id=?"; try (PreparedStatement ps = connection.prepareStatement(deleteSql)) { ps.setString(1, "aa1"); ps.executeUpdate(); } // 接続を閉じます。操作が完了したら、接続が閉じていることを確認してください。そうしないと、接続リークが発生します。 connection.close();
LindormTable でサポートされている SQL 構文の使用方法の詳細については、「SQL リファレンス」をご参照ください。
説明Lindorm SQL では、
INSERT
構文はUPSERT
構文と同じです。ただし、MySQL 用 JDBC クライアントはINSERT
構文向けに最適化されています。したがって、INSERT
構文を使用してデータを書き込むことをお勧めします。バッチ書き込みは、RPC 呼び出しを削減する点で単一行書き込みよりも効率的であり、サーバーが複数の行を一度に処理して、より高いスループットを実現できます。ただし、1 つのバッチで書き込まれる行が多すぎると、サーバーでメモリ不足(OOM)エラーまたはフルガベージコレクション(Full GC)が発生し、サービスの安定性に影響を与える可能性があります。したがって、バッチごとに書き込まれる行数を制御することをお勧めします。
batchSize
はバッチごとに書き込まれる行数を示し、このパラメーターを 50 ~ 100 の範囲の値に設定することをお勧めします。書き込みの並行性を高めることで、書き込みスループットを向上させることができます。