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

Lindorm:Druid を使用してアプリケーションを開発する

最終更新日:Jul 08, 2025

このトピックでは、Druid を使用して LindormTable に接続し、使用する方法について説明します。

前提条件

  • インスタンスで MySQL 互換性機能が有効になっていること。詳細については、「MySQL 互換性機能を有効にする」をご参照ください。

  • Java 開発キット ( JDK ) V1.8 以降がインストールされていること。

  • クライアントの IP アドレスが Lindorm インスタンスのホワイトリストに追加されていること。詳細については、「ホワイトリストを構成する」をご参照ください。

使用上の注意

  • Lindorm SQL フロントエンドノードは、ロードバランシングに Server Load Balancer ( SLB ) を使用し、クライアントはこれらのフロントエンドノードに接続します。クライアントリクエストをフロントエンドノード全体に均等に分散させるために、接続を長時間維持しないことをお勧めします。これを実現するために、phyMaxUseCount パラメーターを構成できます。

  • クエリを実行する前に、接続プールから接続を取得し、クエリ後に conn.close() 操作を呼び出して接続をプールに戻す必要があります。次回クエリを実行するときに、接続プールから再度接続を取得できます。クエリ後に接続が返されず、無効になった場合、Druid はその無効状態を検出できません。

  • 複雑なネットワーク環境では、ゲートウェイのパフォーマンスボトルネック、長いネットワークリンク、ネットワークジッター、高い再送率、または高いパケット損失率が原因で、接続が中断される可能性があります。必要に応じて、接続プールを適切に構成し、ビジネスコードにリトライメカニズムを実装することをお勧めします。

  • サーバーがスペックアップおよび再起動されると、接続が一時的に中断される場合があります。接続プールを使用している場合でも、ビジネスで例外が発生する可能性があります。例外をキャッチし、リトライメカニズムを実装することをお勧めします。

  • ビジネス要件に基づいて接続プールの構成を変更し、構成が有効になるようにすることをお勧めします。 DruidDataSource#getStatData() メソッドと DruidDataSource#dump() メソッドを使用して、プログラムで有効な構成と接続プール情報を定期的にクエリし、ログで構成を確認できます。

手順

  1. Druid を使用して LindormTable に接続する前に、Druid と Lindorm JDBC ドライバーをインストールする必要があります。

    たとえば、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-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>mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.3.0</version>
    </dependency>
  2. Druid のパラメーターを構成します。Maven プロジェクトの src/main/resources パスに、druid.properties ファイルを作成し、次の構成をファイルに追加します。

    # ドライバークラスの名前を指定します。この構成は変更せずに使用できます。
    driverClassName=com.mysql.cj.jdbc.Driver
    # url は、MySQL が LindormTable にアクセスするための JDBC エンドポイントです。ユーザー名とパスワードは、LindormTable にアクセスするための認証情報です。
    # database パラメーターを接続先のデータベースの名前に置き換えます。パフォーマンスを向上させるために、その他のパラメーターは変更しないことをお勧めします。
    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&socketTimeout=120000
    username=****
    password=****
    
    # 接続を作成するために接続プールを初期化します。この構成は変更せずに使用することをお勧めします。
    init=true
    # 初期化中に作成する接続数を指定します。このパラメーターは、要件に基づいて構成できます。
    initialSize=10
    # 接続プール内の最大接続数を指定します。このパラメーターは、要件に基づいて構成できます。このパラメーターをビジネスのスレッドプールと同じ値に設定することをお勧めします。
    maxActive=40
    # 接続プール内のアイドル状態の最小接続数を指定します。このパラメーターは、要件に基づいて構成できます。高パフォーマンスのシナリオでは、このパラメーターを maxActive パラメーターと同じ値に設定することをお勧めします。ビジネスの変動が大きい場合は、このパラメーターを小さい値に設定することをお勧めします。
    minIdle=40
    # クライアントが接続を取得するために待機できる最大期間を指定します。単位: ミリ秒。この値は変更しないことをお勧めします。
    maxWait=30000
    
    # 長時間同じ接続を使用することによって発生するサーバー負荷の不均衡を避けるために、接続の最大使用制限を構成します。これはパフォーマンスにわずかな影響を与えます。
    phyMaxUseCount=30000
    # 接続キープアライブに関連するパラメーターを構成します。これらの構成は変更しないことをお勧めします。変更すると、接続が予期せず切断される可能性があります。
    druid.keepAlive=true
    # 接続の許容アイドル期間を指定します。接続がこの値よりも長い期間アイドル状態になっている場合、接続の有効性がチェックされます。
    druid.keepAliveBetweenTimeMillis=120000
    # 接続がエビクションされるかキープアライブされるかを判断する間隔を指定します。
    timeBetweenEvictionRunsMillis=60000
    # アイドル状態の接続のエビクション時間を指定します。
    minEvictableIdleTimeMillis=1800000
    maxEvictableIdleTimeMillis=1800000
    
    # 接続の検証に必要なパラメーターを構成します。これらの構成は変更しないことをお勧めします。
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false

    パラメーター

    パラメーター

    説明

    url

    Druid クライアントの Java JDBC が MySQL データベースに接続するために使用する URL。URL の形式は次のとおりです: jdbc:mysql://<MySQL 用の LindormTable エンドポイント>/<データベース名>?<接続設定>

    URL にデータベース名を指定しない場合、クライアントはデフォルトデータベースに接続します。 [MySQL 用の LindormTable エンドポイント] の取得方法の詳細については、「エンドポイントを表示する」をご参照ください。

    接続パラメーターを指定すると、パフォーマンスが向上する可能性があります。すべてのパラメーターを指定することをお勧めします。接続設定の詳細については、「接続設定」をご参照ください。

    重要
    • アプリケーションが Elastic Compute Service ( ECS ) インスタンスにデプロイされている場合は、セキュリティを強化し、レイテンシを短縮するために、VPC を使用して Lindorm インスタンスに接続することをお勧めします。

    • アプリケーションがローカルサーバーにデプロイされていて、インターネット経由で Lindorm インスタンスに接続する必要がある場合は、Lindorm コンソールでインスタンスのパブリックエンドポイントを有効にするために、次の手順を実行できます。左側のナビゲーションウィンドウで、[データベース接続] > [ワイドテーブルエンジン] を選択します。 [ワイドテーブルエンジン] タブで、[パブリックエンドポイントを有効にする] をクリックします。

    • VPC を使用して Lindorm インスタンスにアクセスする場合は、url の値に [MySQL 用の LindormTable VPC エンドポイント] を指定します。インターネットを使用して Lindorm インスタンスにアクセスする場合は、url の値に [MySQL 用の LindormTable インターネットエンドポイント] を指定します。

    username

    パスワードを忘れた場合は、LindormTable のクラスタ管理システムでパスワードを変更できます。詳細については、「ユーザーのパスワードを変更する」セクションの「ユーザーを管理する」トピックをご参照ください。

    パスワード

  3. Druid のパラメーター構成を読み込み、接続プールを初期化します。

    // パラメーター構成を読み込みます。
    Properties properties = new Properties();
    InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    properties.load(inputStream);
    // 接続プールを初期化します。
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  4. Druid を使用して JDBC から接続情報を取得し、LindormTable に接続します。

    /* -------------- LindormTable に JDBC を使用して接続する方法の例 ----------------- */
    
    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 構文と同じです。ただし、MySQL クライアント用の JDBC は INSERT 構文向けに最適化されています。したがって、INSERT 構文を使用してデータを書き込むことをお勧めします。

    • バッチ書き込みは、RPC 呼び出しを減らすことで単一行書き込みよりも効率的であり、サーバーが複数の行を同時に処理し、より高いスループットを実現できます。ただし、1 つのバッチで書き込む行が多すぎると、サーバーでメモリ不足 (OOM) エラーまたはフルガベージコレクション (フル GC) が発生し、サービスの安定性に影響を与える可能性があります。したがって、バッチごとに書き込まれる行数を制御することをお勧めします。batchSize はバッチごとに書き込まれる行数を示し、このパラメーターを 50 ~ 100 の範囲の値に設定することをお勧めします。

    • 書き込みの並行性を高めることで、書き込みスループットを向上させることができます。

よくある質問

Q: 接続中に Read timed out エラーが報告されるのはなぜですか?

A: デフォルトでは、Druid 接続プールの接続が 10 秒を超えてタイムアウトした場合、Read timed out エラーが報告されます。接続文字列の socketTimeout パラメーターを構成して、タイムアウト期間をミリ秒単位で指定できます。たとえば、値を 2 分(120,000 ミリ秒)に設定します。例: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&socketTimeout=120000