すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:Druidを使用したApsaraDB RDS for MySQLインスタンスへの接続

最終更新日:Nov 07, 2024

アプリケーションがJavaプログラミング言語を使用しており、アプリケーションとApsaraDB RDS for MySQLインスタンスの間で短期間の接続などの接続が頻繁に確立されている場合、またはRDSインスタンスへの接続が最大数に達している場合は、Druidを使用してRDSインスタンスに接続できます。 Druidは、Javaプログラミング言語の接続プールです。 Druidは、アプリケーションがRDSインスタンスに接続する頻度を減らし、RDSインスタンスのメインスレッドのオーバーヘッドを減らすのに役立ちます。 このトピックでは、Druidを使用してRDSインスタンスに接続する方法について説明します。

前提条件

  • Java Development Kit (JDK) 1.8以降がアプリケーションサーバーにインストールされます。

  • サーバーのIPアドレスがRDSインスタンスのIPアドレスホワイトリストに追加されます。 詳細については、「IPアドレスホワイトリストの設定」をご参照ください。

    説明

    アプリケーションがRDSインスタンスと同じリージョンおよび仮想プライベートクラウド (VPC) にあるElastic Compute Service (ECS) インスタンスにデプロイされている場合、IPアドレスホワイトリストを設定する必要はありません。

準備

次のセクションでは、Druidを使用してRDSインスタンスに接続する前の準備について、Mavenプロジェクトを例として説明します。

説明

Apache Mavenは、開発者に標準化されたJavaプロジェクト構築プロセスと依存関係管理メカニズムを提供するJavaプロジェクト管理ツールです。 詳細については、「Apache Mavenへようこそ」をご参照ください。 MavenベースのJavaプロジェクトには、標準化されたディレクトリ構造があります。 pom.xmlファイルはプロジェクト記述ファイルで、src/main/javaディレクトリにはプロジェクトのJavaソースコードが格納され、src/main/resourcesディレクトリにはプロジェクトのリソースファイルが格納されます。

  • Druidのインストール: pom.xmlファイルのdependenciesセクションに次の依存関係を追加します。 Druid 1.2.13以降を使用することを推奨します

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.19</version>
    </dependency>
  • プロジェクトでdruid-spring-boot-starterを使用する場合は、pom.xmlファイルのdependenciesセクションからDruid-spring-boot-starterが依存するdruid依存関係を除外し、明示的にDruid依存関係を追加する必要があります。 サンプルコード:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.19</version>
        <exclusions>
            <exclusion>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.19</version>
    </dependency>

Druidを使用したRDSインスタンスへの接続

  1. 接続プールのパラメーターの設定: プロジェクトのsrc/main/resourcesディレクトリにdruid.propertiesという名前のファイルを作成し、次の内容をファイルに追加してDruid接続プールのパラメーターを設定します。 パラメーターの詳細については、「接続プールの共通パラメーター」をご参照ください。

    説明

    RDSインスタンスのエンドポイントとポート番号を取得する方法の詳細については、「インスタンスエンドポイントとポートの表示と管理」をご参照ください。

    # The name of the driver class. You do not need to modify this parameter.
    driverClassName=com.mysql.jdbc.Driver
    
    # Specify the url, username, and password parameters based on your business requirements.
    url=jdbc:mysql://rm-bp**************.mysql.rds.aliyuncs.com:3306/database
    username=****
    password=****
    
    # Specify the number of connections that are established during initialization.
    initialSize=20
    # Specify the minimum number of idle connections.
    minIdle=20
    # Specify the maximum number of active connections in a connection pool.
    maxActive=100
    # Specify the maximum period of time that a physical connection can be reused.
    phyTimeoutMillis=3600000
    # Specify the maximum waiting time to obtain a connection. Unit: milliseconds. If no available connections exists in the connection pool and the maximum number of connections is reached, the request from the application to obtain a connection is blocked until the maximum waiting time elapses. We recommend that you retain the parameter setting.
    maxWait=5000
    # Specify the timeout period for establishing a TCP connection between the database driver and the server on which the RDS instance resides. Unit: milliseconds.
    connectTimeout=20000
    # Specify the socket timeout period for an application that is waiting for a response after the application sends data, such as SQL statements, over a TCP connection. Unit: milliseconds.
    socketTimeout=60000
    
    # Configure the required parameters to verify connections. We recommend that you retain the parameter settings.
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    
    # Configure the parameters related to caching. The PreparedStatement parameter is set to true, which indicates that caching is enabled. We recommend that you retain the parameter settings.
    poolPreparedStatements=true
    maxPoolPreparedStatementPerConnectionSize=100
  2. Druid接続プールを使用してRDSインスタンスに接続する: 必要な依存関係をsrc/main/javaディレクトリのソースコードファイルにインポートし、DruidPoolDemoクラスを構築し、Druid接続プールからJava Database Connectivity (JDBC) 接続に関する情報を取得し、RDSインスタンスにアクセスします。

    // Import the required dependencies.
    package com.aliyun.rdsfinops.collector.impl;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class DruidPoolDemo {
        private static DataSource dataSource = null;
        String tableName = "sql_table_test";
        // Load parameter settings.
        static {
            Properties properties = new Properties();
            // Obtain the configurations of the connection pool.
            InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            try {
                properties.load(inputStream);
                // Initialize the connection pool.
                dataSource = DruidDataSourceFactory.createDataSource(properties);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /* 
          View subsequent database operations in the following sections:
          Create a table: public void createTable()
          Insert data: public void insertData()
          Query data: public void selectData()
          Delete data: public void deleteData()
        */
    }

接続プールの共通パラメータ

Druidを使用してRDSインスタンスに接続する場合、RDSインスタンスが安定して効率的に実行されるように、接続プールに次のパラメーターを設定することを推奨します。

重要

潜在的なリスクと不確実性を最小限に抑え、システムの安定性と信頼性を確保するために、本番環境で新しいパラメーター値を適用する前に、完全な機能とパフォーマンステストを実行することをお勧めします。

推奨される設定

Druid接続プールを使用する場合は、データベースの実行時のリスクを軽減するためにパラメーターを設定することを推奨します。 下表に、各パラメーターを説明します。

パラメーター

説明

デフォルト値

推奨値

補足

initialSize

接続プールの初期化中に確立された接続の数。

0

20から80

  • アプリケーションの起动后すぐに同时リクエストを処理できる适切な値を指定します。

  • パラメーターは、平均同時接続数の60% 〜80% の値に設定することを推奨します。

minIdle

アイドル接続の最小数。

0

20から80

  • データベース要求バーストにすばやく応答するために、特定の数の接続を予約できる適切な値を指定します。

  • このパラメーターは、initialSizeパラメーターの値に基づいて設定するか、JVMがオーバーロードされていないときにJava仮想マシン (JVM) が保持する接続数に設定することをお勧めします。

  • maxActiveパラメーターで指定されたアクティブな接続の数は、このパラメーターの影響を受けません。

maxActive

接続プール内のアクティブな接続の最大数。

8

100

  • アプリケーションの実際の要件とデータベースの処理能力に基づいて、このパラメーターを設定します。

  • このパラメーターは、データベースが処理できる同時接続の最大数、またはピーク時の推定同時接続数よりも大きい値に設定することを推奨します。 トラフィックバーストを処理するために、特定の数の接続を予約できます。

phyTimeoutMillis

物理接続を再利用できる最大期間。 単位: ミリ秒

-1

28800000に3600000

  • デフォルト値 -1は、接続が常に再利用可能であることを指定します。

  • ビジネス要件に基づいてこのパラメーターを設定します。 このパラメータは、長期のアイドル接続を防ぎ、リソースを節約するために使用されます。

maxWait

接続を取得するための最大待機時間。 単位: ミリ秒

-1

5000

  • 使用可能な接続が接続プールに存在せず、接続の最大数に達した場合、接続を取得するためのアプリケーションからの要求は、最大待機時間が経過するまでブロックされます。

  • デフォルト値 -1は、アプリケーションが引き続き待機することを指定します。 値0は、アプリケーションが待機しないことを指定します。 このパラメーターを -1 0に設定しないことを推奨します。

  • ほとんどの場合、接続を取得するための待機時間は10〜30ミリ秒です。 ビジネス要件に基づいてこのパラメーターを設定するか、推奨値を使用することを推奨します。

connectTimeout

接続タイムアウト期間。 単位: ミリ秒

10000

3000

  • データベースドライバとRDSインスタンスが存在するサーバーとの間にTCP接続を確立するためのタイムアウト期間を指定します。

  • 接続プールを設定するときは、1秒から10秒の範囲でタイムアウト期間を指定することを推奨します。 タイムアウト期間は、ネットワークの品質とアプリケーションとサーバー間の距離によって異なります。

socketTimeout

ソケットのタイムアウト期間。 単位: ミリ秒

10000

60000に10000

  • アプリケーションがTCP接続を介してSQL文などのデータを送信した後、応答を待っているアプリケーションのタイムアウト時間を指定します。

  • このパラメーターを小さな値に設定しないことを推奨します。 SQL文を長期間実行する場合は、このパラメーターを変更する前に、SQL文またはデータベースを確認する必要があります。

testWhileIdle

アイドル接続検出を有効にするかどうかを指定します。

false

true

このパラメーターを true に設定することを推奨します。 接続プールは、アイドル接続のステータスを定期的にチェックします。

オプション設定

他のパラメーターを設定して、データベースのパフォーマンスを向上できます。 下表に、各パラメーターを説明します。

パラメーター

説明

デフォルト値

推奨値

補足

poolPreparedStatements

PreparedStatementオブジェクトをキャッシュするかどうかを指定します。

true

true

  • このパラメーターをtrueに設定すると、同じSQL文を繰り返し実行したときにSQL文がコンパイルされる回数を減らすことができます。 これにより、データベースのパフォーマンスが向上します。

  • このパラメーターをtrueに設定すると、SQLインジェクション攻撃を効果的に防止し、セキュリティを強化できます。

  • SQL文に対する変更が重要である場合、または多数の大きなフィールドが照会される場合、このパラメーターをtrueに設定すると、JVMおよびデータベースサーバーの大量のメモリが消費されます。

maxPoolPreparedStatementPerConnectionSize

各接続によってキャッシュされるPreparedStatementオブジェクトの最大数。

10

100

  • このパラメーターをtrueに設定すると、接続プールは各接続によってキャッシュされるPreparedStatementオブジェクトの最大数を制限します。

  • アプリケーションが多数の繰り返しSQL文を実行する場合は、このパラメーターの値を増やすことができます。 メモリリソースの無駄を避けるため、このパラメーターに過度に大きな値を指定しないでください。

デフォルト設定

特定のパラメーターのデフォルト設定を使用したり、ビジネス要件に基づいてパラメーターを変更したりできます。 下表に、各パラメーターを説明します。

パラメーター

説明

デフォルト値

推奨値

補足

failFast

コネクション取得時にエラーが発生した場合に実行される操作。

false

false

  • ほとんどの場合、デフォルト値を保持できます。

  • システムがエラーに敏感で、接続の取得に頻繁に障害が発生する次のシナリオでは、このパラメーターをtrueに設定できます。

    • エラーへのクイックレスポンス: 最大接続数に達した場合、または接続がタイムアウトした場合、エラーが発生したときに接続を取得する操作はすぐに失敗します。 このシステムは再試行したり、操作が完了するまで待機したりしません。

    • 最小化された待ち時間: 同時実行性の高いシナリオでは、このパラメーターをmaxWaitThreadCountパラメーターと一緒に使用して、接続を取得するための待ち時間を最小化できます。

timeBetweenEvictionRunsMillis

アイドル接続が検出される間隔。 単位: ミリ秒

60,000

60,000

  • 接続プールは指定された間隔で接続をチェックし、接続のアイドル時間がminEvictableIdleTimeMillisパラメーターで指定された最小アイドル時間を超えているかどうかを識別します。

  • デフォルト値のままにすることを推奨します。 このパラメーターを変更する場合は、最適な接続プールの使用率とパフォーマンスを実現するために、ビジネス要件に基づいてパラメーターを変更します。

その後のデータベース操作

データベースで操作を実行する場合は、ユーザー定義関数をDruidPoolDemoクラスに追加できます。 次のサンプルコードは、テーブルの作成、テーブルへのデータの挿入、データの照会、およびデータの削除の方法の例を示しています。

テーブルの作成

String tableName = "sql_table_test";
public void createTable() throws SQLException {
    // Create a table.
    try (Connection connection = dataSource.getConnection()) {
        try (Statement statement = connection.createStatement()) {
            String sql = "create table if not exists " + tableName + "(id VARCHAR(255), name VARCHAR(255), PRIMARY KEY (id))";
            int ret = statement.executeUpdate(sql);
            System.out.println(ret);
        }
    }
}

データの挿入

String tableName = "sql_table_test";
public void insertData(){
    // Insert data to the table.
    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);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

クエリデータ

String tableName = "sql_table_test";
public void selectData() throws SQLException {
    // Query data in the table.
    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);
            }
        }
    }
}

データの削除

String tableName = "sql_table_test";
public void deleteData(){
    // Delete data from the table.
    try (Connection connection = dataSource.getConnection()) {
        String sql = "delete from " + tableName + " where id=?";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, "aa");
            ps.executeUpdate();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

関連ドキュメント