このトピックでは、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();
}
}
}