Druid は、データベースに接続するために使用される Java Database Connectivity (JDBC) 接続プールです。このトピックでは、Druid を使用して LindormTable に接続し、使用する方法について説明します。
前提条件
Java 開発キット (JDK) 1.8 以降がインストールされていること。
Lindorm インスタンスにホワイトリストが設定されていること。詳細については、「ホワイトリストを設定する」をご参照ください。
LindormTable のバージョンが 2.3.1 以降であること。LindormTable のバージョンをアップグレードする方法の詳細については、「Lindorm インスタンスのマイナーエンジンバージョンをアップグレードする」をご参照ください。
注意事項
Lindorm のフロントノードは、負荷分散のために Server Load Balancer (SLB) を使用し、クライアントはこれらのフロントノードに接続します。クライアントリクエストをフロントノードに均等に分散させるために、接続を長時間維持しないことを推奨します。phyMaxUseCount および phyTimeoutMillis パラメーターを設定できます。
クエリを実行する前に接続プールから接続を取得し、クエリの後に
conn.close()操作を呼び出して接続をプールに返す必要があります。次回クエリを実行するときは、再び接続プールから接続を取得できます。クエリの後に接続が返されず無効になった場合、Druid はその無効な状態を検出できません。複雑なネットワーク環境では、ゲートウェイのパフォーマンスボトルネック、長いネットワークリンク、ネットワークジッター、高い再送率、または高いパケット損失率が原因で接続が中断されることがあります。接続プールを適切に設定し、必要に応じてビジネスコードにリトライメカニズムを実装することを推奨します。
サーバーがアップグレードされ再起動されると、接続が一時的に中断されることがあります。接続プールを使用していても、ビジネスで例外が発生する可能性があります。例外をキャッチし、リトライメカニズムを実装することを推奨します。
必要に応じて接続プールの構成を変更し、構成が有効になることを確認してください。プログラム内で
DruidDataSource#getStatData()およびDruidDataSource#dump()メソッドを使用して、有効な構成と接続プール情報を定期的にクエリし、ログで構成を確認できます。
準備
Druid を使用して LindormTable に接続する前に、Druid と Lindorm JDBC ドライバーをインストールする必要があります。たとえば、Maven プロジェクトの
pom.xmlファイルに次の依存関係を追加できます。<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>com.aliyun.lindorm</groupId> <artifactId>lindorm-all-client</artifactId> <version>2.2.1.3</version> </dependency>druid-spring-boot-starter を使用して Druid を起動する場合、まず druid-spring-boot-starter が依存する druid コンポーネントを除外し、次に構成ファイルに druid コンポーネントへの依存関係を明示的に追加する必要があります。次の例は、druid-spring-boot-starter を使用して 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>com.aliyun.lindorm</groupId> <artifactId>lindorm-all-client</artifactId> <version>2.2.1.3</version> </dependency>
手順
サンプルコードをダウンロードして、ローカルコンピューターで直接コンパイルして実行するか、サンプルコードに基づいて独自のプロジェクトを開発できます。
Druid のパラメーターを設定します。Maven プロジェクトの
src/main/resourcesパスにdruid.propertiesファイルを作成し、ファイルに次の構成を追加します。# ドライバークラスの名前を指定します。この構成は変更せずに維持できます。 driverClassName=com.aliyun.lindorm.table.client.Driver # url、username、および password パラメーターを、ビジネスの実際の値に置き換えることができます。これらのパラメーターの値は Lindorm コンソールで取得できます。 url=jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****.lindorm.rds.aliyuncs.com:30060 username=**** password=**** # **** を接続したいデータベースに置き換えます。 connectionProperties=database=**** # 接続プールを初期化して接続を作成します。この構成は変更せずに維持することを推奨します。 init=true # 初期化中に作成する接続の数を指定します。要件に基づいてこのパラメーターを設定できます。 initialSize=10 # 接続プール内のアイドル接続の数を指定します。要件に基づいてこのパラメーターを設定できます。パフォーマンス専有型シナリオの場合は、このパラメーターを maxActive と同じ値に設定します。ビジネスに大きな変動がある場合は、このパラメーターをより小さい値に設定します。 minIdle=40 # 接続プール内のアイドル接続の最大数を指定します。要件に基づいてこのパラメーターを設定できます。このパラメーターをスレッドプールのサイズと同じ値に設定することを推奨します。 maxActive=40 # クライアントが接続を取得するために待機できる最大時間を指定します。単位: ms。この構成は変更せずに維持することを推奨します。 maxWait=30000 # 同じ接続を長時間使用することによるサーバー側の負荷の不均衡を防ぐために、接続ごとの最大使用回数を指定します。これにより、パフォーマンスにわずかな影響が及ぶ可能性があります。 druid.phyMaxUseCount=10000 # 接続キープアライブに関連するパラメーターを設定します。これらの構成は変更せずに維持することを推奨します。そうしないと、接続が予期せず切断される可能性があります。 # この場合、ConnectionDisconnectedException 例外が報告されます。 druid.keepAlive=true druid.keepAliveBetweenTimeMillis=30000 minEvictableIdleTimeMillis=300000 maxEvictableIdleTimeMillis=600000 timeBetweenEvictionRunsMillis=5000 phyTimeoutMillis=1800000 # 接続の検証に必要なパラメーターを設定します。これらの構成は変更せずに維持することを推奨します。 validationQuery=SELECT 1 testWhileIdle=true testOnBorrow=false testOnReturn=false # キャッシュに関連するパラメーターを設定します。この例では、キャッシュは無効になっています。これらの構成は変更せずに維持することを推奨します。 # そうしないと、NoSuchStatement 例外が報告される可能性があります。 poolPreparedStatements=false maxOpenPreparedStatements=-1 druid.maxPoolPreparedStatementPerConnectionSize=-1説明実際の使用では、次のパラメーターの値を調整または置き換えてください。
url: LindormTable への接続に使用されるエンドポイント。エンドポイントの取得方法の詳細については、「エンドポイントの取得」をご参照ください。
username: LindormTable へのアクセスに使用されるユーザー名。ユーザー名は LindormTable のクラスター管理システムで表示できます。詳細については、「ユーザーの管理」をご参照ください。
password: LindormTable へのアクセスに使用されるパスワード。パスワードを忘れた場合は、LindormTable のクラスター管理システムでパスワードを変更できます。パスワードの変更方法の詳細については、「ユーザーのパスワードを変更する」をご参照ください。
設定可能なパラメーターの詳細については、「DruidDataSource パラメーター構成」をご参照ください。
Druid のパラメーター構成をロードし、接続プールを初期化します。
// パラメーター構成をロードします。 Properties properties = new Properties(); InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(inputStream); // 接続プールを初期化します。 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Druid を使用して JDBC から接続情報を取得し、LindormTable に接続します。
/* -------------- JDBC を使用して LindormTable に接続する方法の例 ----------------- */ 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 = "upsert 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); } } // テーブル内のデータをクエリします。 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(); } }
付録: 接続プールの負荷分散に関する説明
接続プールモード (TCP 持続的接続) はより効率的ですが、次のシナリオでは分散負荷分散にフレンドリではなく、不均一な接続負荷につながる可能性があります。
多数の接続が突然作成され、不均一な分散が発生する
アプリケーションが突然多数の接続を作成した場合、負荷分散デバイスがバックエンドノードの接続統計情報を時間内にリフレッシュしないと、一部のバックエンド LDServer ノードがより多くの接続リクエストを処理する可能性があります。コネクションプーリングメカニズムと組み合わせることで、最終的に一部の LDServer ノードが他のノードよりも高いプレッシャーを持つことになり、不均一な接続分散が生じ、システム全体のパフォーマンスに影響を与えます。
負荷分散のヘルスチェックの異常により、不均一な分散が発生する
負荷分散は、アクティブなヘルスチェックを使用して、バックエンドノードが正常かどうかを判断します。ヘルスチェックで時折異常が発生すると、一部の LDServer ノードの接続が少なくなることがあります。コネクションプーリングと組み合わせることで、最終的に一部の LDServer ノードが他のノードよりも低いプレッシャーを持つことになり、システム全体のパフォーマンスに影響を与えます。
Druid 接続プールには、接続プール内の接続を定期的に (たとえば、30 分ごとまたは 10,000 回の実行ごとに) リフレッシュするために、phyTimeoutMillis および phyMaxUseCount パラメーターが追加されています。これにより、パフォーマンスを維持しながら上記の問題を解決できます。デフォルトでこれらの 2 つのパラメーターを追加することを推奨します。