Alibaba Druid 接続プールを使用して、MySQL 互換エンドポイント経由で LindormTable に接続します。
前提条件
開始する前に、以下を確認してください。
ご利用の Lindorm インスタンスで MySQL 互換性機能が有効になっていること。「MySQL 互換性機能を有効にする」をご参照ください。
JDK V1.8 以降がインストールされていること。
ご利用のクライアント IP アドレスが Lindorm インスタンスのホワイトリストに追加されていること。「ホワイトリストを構成する」をご参照ください。
依存関係の追加
Maven プロジェクトの pom.xml ファイルに、次の依存関係を追加します。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>`druid-spring-boot-starter` を使用する場合、バンドルされている Druid コンポーネントを除外し、Druid 依存関係を明示的に宣言します。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>接続プールの構成
Maven プロジェクトの src/main/resources ディレクトリに、次の内容で druid.properties を作成します。
# ドライバークラス — この値は変更しないでください。
driverClassName=com.mysql.cj.jdbc.Driver
# <endpoint> をお使いの MySQL 用 LindormTable エンドポイントに、<database> をお使いのデータベース名に置き換えます。
# エンドポイントを取得するには、View endpoints: https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints をご参照ください。
# 最適なパフォーマンスを維持するために、他の URL パラメーターは変更しないでください。
url=jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000
username=<username>
password=<password>
# 起動時に接続プールを初期化します — この値は変更しないでください。
init=true
# 初期化時に作成される接続数。
initialSize=10
# プール内の最大接続数。スレッドプールサイズに合わせて設定してください。
maxActive=40
# 最小アイドル接続数。高スループットのシナリオでは、この値を maxActive と同じ値に設定します。
# 変動の大きいワークロードの場合は、より小さい値を設定します。
minIdle=40
# クライアントが接続を取得するまで待機する最大時間 (ミリ秒) — この値は変更しないでください。
maxWait=30000
# 単一の接続を再利用できる回数を制限し、Lindorm SQL フロントノード間の不均一なロードを防ぎます。
# パフォーマンスへの影響は軽微です。
phyMaxUseCount=30000
# キープアライブ設定 — 予期しない切断を防ぐため、これらの値は変更しないでください。
druid.keepAlive=true
# 接続がこの値 (ミリ秒) を超えてアイドル状態であった場合、その有効性がチェックされます。
druid.keepAliveBetweenTimeMillis=120000
# アイドル接続がエビクションまたはキープアライブの対象であるかチェックする間隔 (ミリ秒)。
timeBetweenEvictionRunsMillis=60000
# この値 (ミリ秒) を超えてアイドル状態の接続は、エビクションの候補になります。
minEvictableIdleTimeMillis=1800000
maxEvictableIdleTimeMillis=1800000
# 接続検証設定 — これらの値は変更しないでください。
testWhileIdle=true
testOnBorrow=false
testOnReturn=false接続パラメーター
| パラメーター | 説明 |
|---|---|
url | JDBC 接続 URL。形式: jdbc:mysql://<LindormTable endpoint for MySQL>/<database name>?<connection settings>。データベース名を省略すると、クライアントはデフォルトデータベースに接続します。すべての接続設定の詳細については、「接続設定」をご参照ください。 |
username | LindormTable ユーザー名。パスワードを忘れた場合は、LindormTable クラスター管理システムでリセットしてください。「ユーザーのパスワードを変更する」をご参照ください。 |
password | LindormTable パスワード。 |
アプリケーションが Elastic Compute Service (ECS) インスタンスで実行される場合、低遅延と高セキュリティのために仮想プライベートクラウド (VPC) 接続を使用してください。
urlパラメーターで LindormTable の MySQL 用 VPC エンドポイントを指定します。アプリケーションがインターネット経由で接続する場合、Lindorm コンソールでパブリックエンドポイントを有効化します。[データベース接続] > [ワイドテーブルエンジン] に移動し、[ワイドテーブルエンジン] タブで [パブリックエンドポイントの有効化] をクリックします。その後、
urlパラメーターに LindormTable インターネットエンドポイント (MySQL用) を指定します。
接続プールのサイズ設定
Lindorm SQL フロントエンドノードは、負荷分散のために Server Load Balancer (SLB) を使用します。リクエストを均等に分散するために、接続を長時間保持することは避けてください。接続の再利用を制限するために phyMaxUseCount を構成します。
maxActiveをアプリケーションのスレッドプールサイズと同じに設定します。高スループットで遅延の影響を受けやすいワークロードの場合、接続が常に準備できるように
minIdleをmaxActiveと同じに設定します。著しいトラフィック変動があるワークロードの場合、アイドルリソースの消費を削減するために、より小さい
minIdleを使用します。
接続プールの初期化
構成ファイルをロードし、データソースを作成します。
// druid.properties から構成をロードします。
Properties properties = new Properties();
InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
// 接続プールを初期化します。
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);CRUD 操作の実行
すべての例はプールから接続を取得し、try-with-resources を使用して自動的に返却します。try-with-resources を使用しない場合は、conn.close() を明示的に呼び出してください。これは接続をプールに返却するものであり、接続を閉じるものではありません。接続が返却されずに無効になった場合、Druid は無効な状態を検出できません。
String tableName = "sql_table_" + new Random().nextInt(1000);
// テーブルを作成します。
try (Connection connection = dataSource.getConnection()) {
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);
}
}
// 単一の行を挿入します。
try (Connection connection = dataSource.getConnection()) {
String sql = "insert into " + tableName + "(id,name) values(?,?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.setString(2, "bb");
int ret = ps.executeUpdate();
System.out.println(ret);
}
}
// バッチ挿入。
String insertSql = "insert into " + tableName + "(id,name) values(?,?)";
int batchSize = 100;
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement ps = connection.prepareStatement(insertSql)) {
for (int i = 0; i < batchSize; i++) {
ps.setString(1, "aa" + i);
ps.setString(2, "bb" + i);
ps.addBatch();
}
ps.executeBatch();
}
}
// データをクエリします。
try (Connection connection = dataSource.getConnection()) {
String sql = "select * from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
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);
}
}
}
// データを削除します。
try (Connection connection = dataSource.getConnection()) {
String sql = "delete from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.executeUpdate();
}
}Lindorm SQL では、
INSERTはUPSERTと同等です。JDBC MySQL クライアントはINSERTに最適化されているため、データを書き込む際はINSERT構文を使用してください。batchSizeは 50 から 100 の間に保ってください。より大きなバッチは、サーバーでメモリ不足 (OOM) エラーまたは Full GC を引き起こす可能性があります。書き込みスループットをさらに向上させるには、書き込み同時実行数を増やしてください。
本番運用時の考慮事項
接続中断の処理
複雑なネットワーク環境では、ゲートウェイのボトルネック、ネットワークジッター、または高いパケット損失が原因で接続中断が発生する可能性があります。druid.properties のキープアライブ設定はアイドル接続の維持に役立ちますが、一時的な障害に備えてアプリケーションコードにリトライメカニズムを実装する必要もあります。
サーバーがアップグレードされ再起動されると、アクティブ接続が一時的に中断される場合があります。例外をキャッチし、操作をリトライしてください。
接続プールの監視
有効な構成と接続プールの統計を定期的にチェックし、ログ内の構成を確認してください。
druidDataSource.getStatData(); // 現在のプール統計を返します
druidDataSource.dump(); // 詳細なプール構成と状態をログに記録しますよくある質問
アプリケーションで「Read timed out」がスローされるのはなぜですか?
Druid のデフォルトのソケットタイムアウトは 10 秒です。クエリにこれより時間がかかると、接続がタイムアウトし、このエラーがスローされます。JDBC URL で socketTimeout をミリ秒単位で設定してください。推奨値は 120000 (2 分) です。
jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000