All Products
Search
Document Center

ApsaraDB for OceanBase:Example of configuring a DBCP connection pool

Last Updated:Aug 01, 2023

This topic describes how to configure dependencies and configuration files for a DBCP connection pool and provides relevant sample code.

Configure dependencies

<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>

Configuration file

The following example shows the content of the dbcp.properties configuration file:

#Driver name
driverClassName=com.oceanbase.jdbc.Driver
#url
url=jdbc:oceanbase://xxx.xxx.xxx.xxx:1521/?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC
#Username
username=a****
#Password
password=******
#Number of initial connections
initialSize=30
#Maximum number of active connections
maxTotal=30
#Maximum number of idle connections
maxIdle=10
#Minimum number of idle connections
minIdle=5
#Maximum wait time (ms)
maxWaitMillis=1000
#Whether to reclaim connections no longer used by applications to the connection pool. (This version uses the removeAbandonedOnMaintenance and removeandonedonborrow methods.)
#removeAbandoned=true
removeAbandonedOnMaintenance=true
removeAbandonedOnBorrow=true
#A connection is deleted only when it is not used within the specified number of seconds. (The value is set to 1 second only for the test program.)
removeAbandonedTimeout=1

Sample code

Tools

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 configuration class
 * @author SUN
 */
public class KCYDBCPUtil {

    private static Properties properties = new Properties();
    private static DataSource dataSource;
    //Load the DBCP configuration file
    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();
        }
    }

    //Obtain a connection from the connection pool
    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;

    //Obtain a database connection
    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("========Database connected========");
        } catch (Exception e) {
            e.printStackTrace();
//            System.out.println("========Database connection failed========");
            return null;
        }
        return conn;
    }
}

Test class

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. Create a connection each time before a piece of data is written.
    @Test
    public void testWriteDBByEveryConn() throws Exception{
        for(int i = 0; i < 20; i++){
            writeDBByEveryConn(i);
        }
        System.out.println("DONE");

    }

    //Test. Obtain a connection from the connection pool each time before a piece of data is written.
    @Test
    public void testWriteDBByDBCP() throws Exception{
        for(int i = 0; i < 20; i++){
            writeDBByDBCP(i);
        }
        System.out.println("DONE");
    }

    //Test. Establish only one connection and write all data.
    @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");
    }

    //Write data to the database without using the connection pool, and create a connection each time before a piece of data is written.
    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();
            }

        }
    }

    //Write data to the database without using the connection pool, and write all data by using only one connection.
    public void writeDBByOneConn(int data, Statement stat){
        String sql = "insert into dbcp values (" + data + ")";
        try{
            stat.executeUpdate(sql);
        }catch(Exception e){
            e.printStackTrace() ;
        }
    }

    //Write data to the database through the DBCP connection pool.
    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();
        }
    }
}