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

ApsaraDB for OceanBase:DBCP 接続プールの構成例

最終更新日:Jan 19, 2025

このトピックでは、DBCP 接続プールの依存関係と構成ファイルを設定する方法について説明し、関連するサンプルコードを提供します。

依存関係の構成

<dependencies>
    <dependency>
        <groupId>com.oceanbase</groupId>
        <artifactId>oceanbase-client</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.7.0</version>
    </dependency>
</dependencies>

構成ファイル

次の例は、dbcp.properties 構成ファイルの内容を示しています。

# ドライバー名
driverClassName=com.oceanbase.jdbc.Driver
# URL
url=jdbc:oceanbase://xxx.xxx.xxx.xxx:1521/?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC
# ユーザー名
username=a****
# パスワード
password=******
# 初期接続数
initialSize=30
# アクティブな接続の最大数
maxTotal=30
# アイドル状態の接続の最大数
maxIdle=10
# アイドル状態の接続の最小数
minIdle=5
# 最大待機時間 (ミリ秒)
maxWaitMillis=1000
# アプリケーションで使用されなくなった接続を接続プールに再利用するかどうか。(このバージョンでは、removeAbandonedOnMaintenance メソッドと removeAbandonedOnBorrow メソッドを使用します。)
#removeAbandoned=true
removeAbandonedOnMaintenance=true
removeAbandonedOnBorrow=true
# 指定された秒数以内に使用されない場合にのみ、接続が削除されます。(テスト プログラムでは、値は 1 秒に設定されています。)
removeAbandonedTimeout=1

サンプル コード

ツール

package com.dbcptest;


import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;

/**
 * DBCP 構成クラス
 * @author SUN
 */
public class KCYDBCPUtil {

    private static Properties properties = new Properties();
    private static DataSource dataSource;
    // DBCP 構成ファイルの読み込み
    static{
        try{
            FileInputStream is = new FileInputStream("com.dbcptest/config/dbcp.properties");
            properties.load(is);
        }catch(IOException e){
            e.printStackTrace();
        }

        try{
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    // 接続プールから接続を取得する
    public static Connection getConnection(){
        Connection connection = null;
        try{
            connection = dataSource.getConnection();
        }catch(SQLException e){
            e.printStackTrace();
        }
        try {
            connection.setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public static void main(String[] args) {
        getConnection();
    }
}
package com.dbcptest;


import java.sql.Connection;
import java.sql.DriverManager;

public class DBConn {
    private static Connection conn = null;

    // データベース接続を取得する
    public static Connection getConnection() {
        try {
            Class.forName("com.oceanbase.jdbc.Driver");
            DriverManager.registerDriver(new com.oceanbase.jdbc.Driver());
            String dbUrl = "jdbc:oceanbase://xxx.xxx.xxx.xxx:1521/?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC";
            conn = DriverManager.getConnection(dbUrl, "a****", "******");
//            System.out.println("========データベース接続済み========");
        } catch (Exception e) {
            e.printStackTrace();
//            System.out.println("========データベース接続失敗========");
            return null;
        }
        return conn;
    }
}

テスト クラス

package com.dbcptest;


import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;


public class DBCPTest {

    // テスト。データが書き込まれる前に毎回接続を作成します。
    @Test
    public void testWriteDBByEveryConn() throws Exception{
        for(int i = 0; i < 20; i++){
            writeDBByEveryConn(i);
        }
        System.out.println("DONE");

    }

    // テスト。データが書き込まれる前に毎回接続プールから接続を取得します。
    @Test
    public void testWriteDBByDBCP() throws Exception{
        for(int i = 0; i < 20; i++){
            writeDBByDBCP(i);
        }
        System.out.println("DONE");
    }

    // テスト。1 つの接続のみを確立し、すべてのデータを書き込みます。
    @Test
    public void testWriteDBByOneConn() throws Exception{
        Connection conn = DBConn.getConnection();
        Statement stat = conn.createStatement();
        for(int i = 0; i < 2000; i++){
            writeDBByOneConn(i, stat);
        }
        conn.close();
        System.out.println("DONE");
    }

    // 接続プールを使用せずにデータベースにデータを書き込み、データが書き込まれる前に毎回接続を作成します。
    public void writeDBByEveryConn(int data){
        String sql = "insert into dbcp values (" + data + ")";
        Connection conn = DBConn.getConnection();
        try{
            Statement stat = conn.createStatement();
            stat.executeUpdate(sql);
        }catch(Exception e){
            e.printStackTrace() ;
        }finally{
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

    // 接続プールを使用せずにデータベースにデータを書き込み、1 つの接続のみを使用してすべてのデータを書き込みます。
    public void writeDBByOneConn(int data, Statement stat){
        String sql = "insert into dbcp values (" + data + ")";
        try{
            stat.executeUpdate(sql);
        }catch(Exception e){
            e.printStackTrace() ;
        }
    }

    // DBCP 接続プールを介してデータベースにデータを書き込みます。
    public void writeDBByDBCP(int data){
        String sql = "insert into dbcp values (" + data + ")";
        try {
            Connection conn = KCYDBCPUtil.getConnection();
            Statement stat = conn.createStatement();
            stat.executeUpdate(sql);
            conn.commit();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}