本記事では、Commons Pool、MySQL Connector/J、および OceanBase データベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、更新、削除、クエリ、テーブルの削除など、基本的なデータベース操作を実現する方法について説明します。
前提条件
OceanBaseデータベースをインストールし、MySQLテナントを作成していること。
JDK 1.8とMavenをインストールしていること。
Eclipseをインストールしていること。
説明
このドキュメントでコードを実行するために使用されているツールはEclipse IDE for Java Developers 2022-03バージョンですが、個人の好みに応じて適したツールを選択してサンプルコードを実行することもできます。
手順
説明
ここで説明する手順は、Windows環境でEclipse IDE for Java Developers 2022-03を使用してこのプロジェクトをコンパイルおよび実行する場合のものです。他のOS環境やコンパイラを使用する場合は、手順が若干異なる可能性があります。
commonpool-mysql-clientプロジェクトをEclipseにインポートします。- OceanBaseデータベースのURLを取得します。
commonpool-mysql-clientプロジェクト内のデータベース接続情報を修正します。commonpool-mysql-clientプロジェクトを実行します。
ステップ1:commonpool-mysql-clientプロジェクトをEclipseにインポートする
Eclipseを開き、メニューバーからFile->Open Projects from File Systemを選択します。
ポップアップダイアログで、Directoryボタンをクリックしてプロジェクトのディレクトリを選択し、Finishをクリックしてインポートを完了します。
説明
Eclipseを使用してMavenプロジェクトをインポートすると、プロジェクト内の
pom.xmlファイルを自動的に検出し、その記述に基づいて必要な依存ライブラリをダウンロードしてプロジェクトに追加します。
プロジェクトの状況を確認します。

ステップ2:OceanBaseデータベースのURLを取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
OceanBaseデータベースの接続文字列情報に基づいて、以下のURLの対応する情報を入力します。
jdbc:mysql://$host:$port/$database_name?user=$user_name&password=$password&useSSL=falseパラメータ説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセスするデータベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、DROP、INSERT、DELETE、UPDATEおよびSELECT権限が付与されていなければなりません。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。password:アカウントのパスワード。
MySQL Connector/J接続プロパティの詳細については、Configuration Propertiesを参照してください。
例:
jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?user=test_user001@mysql001&password=******&useSSL=false
ステップ3:commonpool-mysql-clientプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、ファイルcommonpool-mysql-client/src/main/resources/db.properties内のデータベース接続情報を修正します。

例:
- OBServerノードのIPアドレスは
xxx.xxx.xxx.xxxです。 - アクセスポートは2881を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
test_user001@mysql001です。mysql001はOceanBaseデータベースで作成されたMySQLモードのユーザーテナントであり、test_user001はテナントmysql001のユーザー名です。 - パスワードは
******です。
コード:
...
db.url=jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?useSSL=false
db.username=test_user001@mysql001
db.password=******
...
ステップ4:commonpool-mysql-clientプロジェクトを実行する
プロジェクトナビゲータービューで、src/main/javaディレクトリを見つけて展開します。
Main.javaファイルを右クリックし、Run As->Java Applicationを選択します。

Eclipseのコンソールウィンドウで出力結果を確認します。

プロジェクトコードについて
commonpool-mysql-client をクリックしてプロジェクトコードをダウンロードします。これは、commonpool-mysql-client.zip という名前の圧縮ファイルです。
解凍すると、commonpool-mysql-client という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
commonpool-mysql-client
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
ファイルの説明:
src:ソースコードのルートディレクトリです。main:アプリケーションの主要なロジックを含むメインコードディレクトリです。java:Javaソースコードディレクトリです。com:Javaパッケージディレクトリです。example:サンプルプロジェクトのパッケージディレクトリです。Main.java:テーブルの作成、データの挿入、削除、更新、クエリなどのロジック処理を含むメインクラスプログラムのサンプルファイルです。resources:設定ファイルなどを含むリソースファイルディレクトリです。db.properties:データベース接続に関するパラメータを含む接続プールの設定ファイルです。pom.xml:プロジェクトの依存関係とビルド設定を管理するために使用されるMavenプロジェクトの設定ファイルです。
pom.xmlコードの紹介
pom.xmlファイルはMavenプロジェクトの設定ファイルであり、プロジェクトの依存関係、プラグイン、ビルドルールなどの情報を定義しています。MavenはJavaプロジェクト管理ツールで、依存関係のダウンロード、プロジェクトのコンパイル、パッケージ化などの操作を自動化できます。
本記事のpom.xmlファイルのコードは、主に以下の部分で構成されています:
ファイル宣言ステートメント。
このファイルがXMLファイルであり、使用するXMLバージョンが
1.0、文字エンコーディング方式がUTF-8であることを宣言します。コード:
<?xml version="1.0" encoding="UTF-8"?>POMの名前空間とPOMモデルバージョンの設定。
xmlnsを使用して、POMの名前空間をhttp://maven.apache.org/POM/4.0.0と指定します。xmlns:xsiを使用して、XML名前空間をhttp://www.w3.org/2001/XMLSchema-instanceと指定します。xsi:schemaLocationを使用して、POMの名前空間をhttp://maven.apache.org/POM/4.0.0、POMのXSDファイルの場所をhttp://maven.apache.org/xsd/maven-4.0.0.xsdと指定します。<modelVersion>要素を使用して、このPOMファイルで使用するPOMモデルバージョンを4.0.0と指定します。
コード:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- その他の設定 --> </project>基本情報の設定。
<groupId>を使用して、プロジェクトが属する組織をcom.exampleと指定します。<artifactId>を使用して、プロジェクトの名前をcommonpool-mysql-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>com.example</groupId> <artifactId>commonpool-mysql-client</artifactId> <version>1.0-SNAPSHOT</version>プロジェクトソースファイルのプロパティ設定。
Mavenのコンパイラプラグインを
maven-compiler-pluginと指定し、ソースコードとターゲットJavaバージョンをどちらも8に設定しています。これは、プロジェクトのソースコードがJava 8の機能を使用して記述されており、コンパイル後のバイトコードもJava 8ランタイム環境と互換性があることを意味します。この設定により、プロジェクトはコンパイル時および実行時にJava 8の構文と機能を正しく処理できるようになります。説明
Java 1.8とJava 8は、同じバージョンの異なる命名方法です。
コード:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build>プロジェクトが依存するコンポーネントの設定。
データベースとのやり取りを行うために、
mysql-connector-java依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をmysqlと指定します。<artifactId>を使用して、依存関係の名前をmysql-connector-javaと指定します。<version>を使用して、依存関係のバージョン番号を5.1.40と指定します。
コード:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>プロジェクトでこのライブラリの機能とクラスを使用できるように、
commons-pool2依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をorg.apache.commonsと指定します。<artifactId>を使用して、依存関係の名前をcommons-pool2と指定します。<version>を使用して、依存関係のバージョン番号を2.7.0と指定します。
コード:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.7.0</version> </dependency>
db.propertiesコードの紹介
db.properties は本記事の例となる接続プールの設定ファイルであり、接続プールの設定プロパティが含まれています。これらのプロパティには、データベースURL、ユーザー名、パスワード、接続プールのその他のオプションが含まれます。
本記事の db.properties ファイルのコードは、主に以下の部分で構成されています:
データベース接続パラメータの設定。
- データベース接続のURLを設定します。これには、ホストIPアドレス、ポート番号、アクセスするデータベースが含まれます。
- データベースのユーザー名を設定します。
- データベースのパスワードを設定します。
コード:
db.url=jdbc:mysql://$host:$port/$database_name?useSSL=false db.username=$user_name db.password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセスするデータベース名。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
その他の接続プールパラメータの設定。
- 接続プールの最大接続数を10に設定します。これは、接続プール内に同時に最大10個の接続を持つことができることを意味します。
- 接続プールの最大アイドル接続数を5に設定します。接続プール内の接続数が最大アイドル接続数を超えると、余分な接続は閉じられます。
- 接続プールの最小アイドル接続数を2に設定します。接続プール内で使用されている接続がない場合でも、少なくとも2つのアイドル接続が維持されます。
- 接続プールから接続を取得するための最大待機時間を5000ミリ秒に設定します。接続プール内に利用可能な接続がない場合、接続を取得する操作は最大待機時間を超えるまで待機します。
コード:
pool.maxTotal=10 pool.maxIdle=5 pool.minIdle=2 pool.maxWaitMillis=5000
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整および設定を行うことを推奨します。
Commons Pool 2のよく使われる設定パラメータ:
パラメータ |
説明 |
|---|---|
| url | データベースのURLアドレスを指定します。データベースの種類、ホスト名、ポート番号、データベース名などの情報が含まれます。 |
| username | データベース接続に必要なユーザー名。 |
| password | データベース接続に必要なパスワード。 |
| maxTotal | オブジェクトプールで作成できる最大オブジェクト数を指定します。 |
| maxIdle | オブジェクトプール内で保持できる最大アイドルオブジェクト数を指定します。 |
| minIdle | オブジェクトプール内で保持される最小アイドルオブジェクト数を指定します。 |
| blockWhenExhausted | オブジェクトプールが枯渇した場合の borrowObject 操作の動作を指定します。
|
| maxWaitMillis | プールが枯渇した場合、borrowObject メソッドが待機する最大時間(ミリ秒)を指定します。 |
| testOnBorrow | borrowObject メソッドの呼び出し時にオブジェクトを検証するかどうかを指定します。
|
| testOnReturn | returnObject メソッドの呼び出し時にオブジェクトを検証するかどうかを指定します。
|
| testWhileIdle | オブジェクトがアイドル状態のときに検証するかどうかを指定します。詳細は以下の通りです:
|
| timeBetweenEvictionRunsMillis | アイドルオブジェクトのエビクションスレッドのスケジューリング間隔(ミリ秒)を指定します。 |
| numTestsPerEvictionRun | エビクションスレッドがスケジューリングされるたびにチェックするアイドルオブジェクト数を指定します。 |
Main.javaのコード紹介
Main.java ファイルはサンプルプログラムの一部であり、Commons Pool 2を使用してデータベース操作を実行する方法を示すコードです。本記事の Main.java ファイルのコードは、主に以下の部分で構成されています:
パッケージの定義と必要なクラスのインポート。
- 現在のコードが属するパッケージ名を
com.exampleと宣言します。 java.io.IOExceptionクラスをインポートします。これは入出力例外を処理するために使用されます。java.sql.Connectionクラスをインポートします。これはデータベースへの接続を表します。このオブジェクトを使用してSQLステートメントを実行し、結果を取得できます。java.sql.DriverManagerクラスをインポートします。これはドライバのロードとデータベース接続の確立を管理するために使用されます。このクラスを使用してデータベース接続を取得できます。java.sql.ResultSetクラスをインポートします。これはSQLクエリの結果セットを表します。このオブジェクトを使用してクエリ結果を走査および操作できます。java.sql.SQLExceptionクラスをインポートします。これはSQLステートメント関連の例外状況を処理するために使用されます。java.sql.Statementクラスをインポートします。これはSQLステートメントを実行するオブジェクトです。ConnectionオブジェクトのcreateStatementメソッドを使用して作成できます。java.util.Propertiesクラスをインポートします。これはキーと値のペアのコレクションであり、設定情報の読み込みと保存に使用されます。設定ファイルからデータベースの接続情報を読み込むことができます。org.apache.commons.pool2.ObjectPoolクラスをインポートします。これはオブジェクトプールのインターフェースであり、オブジェクトの取得や返却など、プール化されたオブジェクトの基本的な操作を定義しています。org.apache.commons.pool2.PoolUtilsクラスをインポートします。これはオブジェクトプールを操作しやすくするためのいくつかのツールメソッドを提供します。org.apache.commons.pool2.PooledObjectクラスをインポートします。これはオブジェクトプール管理を実装したラッピングオブジェクトです。このインターフェースを実装することで、プール化されたオブジェクトのライフサイクルを管理できます。org.apache.commons.pool2.impl.GenericObjectPoolクラスをインポートします。これはObjectPoolインターフェースのデフォルト実装クラスであり、接続プールの基本機能を実装しています。org.apache.commons.pool2.impl.GenericObjectPoolConfigクラスをインポートします。これはGenericObjectPoolの設定クラスであり、接続プールのプロパティを設定するために使用されます。org.apache.commons.pool2.impl.DefaultPooledObjectクラスをインポートします。これはPooledObjectインターフェースのデフォルト実装クラスであり、プール化されたオブジェクトのラッピングを管理するために使用されます。実際の接続オブジェクトやその他の管理情報を含むことができます。
コード:
package com.example; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import org.apache.commons.pool2.ObjectPool; import org.apache.commons.pool2.PoolUtils; import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.commons.pool2.impl.DefaultPooledObject;- 現在のコードが属するパッケージ名を
Mainクラスを作成し、mainメソッドを定義します。Mainクラスとmainメソッドを定義します。mainメソッドは、接続プールを使用してデータベースから一連の操作を実行する方法を示すために使用されます。具体的な手順は以下のとおりです:プログラムのエントリポイントとして、
Mainという名前のpublicクラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムの実行開始点として、public staticメソッド
mainを定義します。データベース設定ファイルの読み込み:
- データベース設定情報を格納するための
Propertiesオブジェクトを作成します。 - Mainクラスのクラスローダを使用して、
db.propertiesリソースファイルの入力ストリームを取得し、Propertiesオブジェクトのload()メソッドを使用してこの入力ストリームを読み込み、プロパティファイル内のキーと値のペアをpropsオブジェクトにロードします。 - スローされる可能性のある
IOException例外をキャッチし、例外スタック情報を出力します。
- データベース設定情報を格納するための
データベース接続プールの設定の作成:
- 接続プールの動作を設定するためのジェネリックオブジェクトプール設定オブジェクトを作成します。
- 接続プールで許可される最大接続数を設定します。
- 接続プールで許容される最大アイドル接続数を設定します。
- 接続プールで許容される最小アイドル接続数を設定します。
- 接続取得の最大待機時間を設定します。
データベース接続プールの作成:スレッドセーフな接続プールオブジェクト
connectionPoolを作成し、ConnectionFactoryオブジェクトとpoolConfig設定オブジェクトを使用してジェネリックオブジェクトプールを作成し、それをスレッドセーフなオブジェクトプールでラッピングします。接続プールをスレッドセーフにラッピングすることで、マルチスレッド環境における接続の取得と解放操作の安全性を確保できます。データベース接続の取得:接続プールの
borrowObject()メソッドを使用してデータベース接続を取得し、tryコードブロック内でその接続を使用してデータベース操作を実行します。createTable()メソッドを呼び出してテーブルを作成します。insertData()メソッドを呼び出してデータを挿入します。selectData()メソッドを呼び出してデータをクエリします。updateData()メソッドを呼び出してデータを更新します。- 再度
selectData()メソッドを呼び出して、更新後のデータをクエリします。 deleteData()メソッドを呼び出してデータを削除します。- 再度
selectData()メソッドを呼び出して、削除後のデータをクエリします。 dropTable()メソッドを呼び出してテーブルを削除します。- 例外が発生した場合はキャッチして出力します。
その他のデータベース操作メソッドを定義します。
コード:
public class Main { public static void main(String[] args) { // Load the database configuration file Properties props = new Properties(); try { props.load(Main.class.getClassLoader().getResourceAsStream("db.properties")); } catch (IOException e) { e.printStackTrace(); } // Create the database connection pool configuration GenericObjectPoolConfig<Connection> poolConfig = new GenericObjectPoolConfig<>(); poolConfig.setMaxTotal(Integer.parseInt(props.getProperty("pool.maxTotal"))); poolConfig.setMaxIdle(Integer.parseInt(props.getProperty("pool.maxIdle"))); poolConfig.setMinIdle(Integer.parseInt(props.getProperty("pool.minIdle"))); poolConfig.setMaxWaitMillis(Long.parseLong(props.getProperty("pool.maxWaitMillis"))); // Create the database connection pool ObjectPool<Connection> connectionPool = PoolUtils.synchronizedPool(new GenericObjectPool<>(new ConnectionFactory( props.getProperty("db.url"), props.getProperty("db.username"), props.getProperty("db.password")), poolConfig)); // Get a database connection try (Connection connection = connectionPool.borrowObject()) { // Create table createTable(connection); // Insert data insertData(connection); // Query data selectData(connection); // Update data updateData(connection); // Query the updated data selectData(connection); // Delete data deleteData(connection); // Query the data after deletion selectData(connection); // Drop table dropTable(connection); } catch (Exception e) { e.printStackTrace(); } } // テーブルを作成するためのメソッドを定義します。 // データを挿入するためのメソッドを定義します。 // データを更新するためのメソッドを定義します。 // データを削除するためのメソッドを定義します。 // データをクエリするためのメソッドを定義します。 // テーブルを削除するためのメソッドを定義します。 // ConnectionFactoryクラスを定義します。 }テーブルを作成するためのメソッドを定義します。
createTableという名前のメソッドを定義し、Connectionオブジェクトをパラメータとして受け取ります。具体的な手順は以下のとおりです:- プライベート静的メソッド
createTable()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 - 接続の
createStatement()メソッドを使用してStatementオブジェクトを作成し、try-with-resourcesステートメント内でこのオブジェクトを使用してデータベース操作を実行します。 - 文字列変数
sqlを定義し、テーブル作成のSQLステートメントを格納します。 StatementオブジェクトのexecuteUpdate()メソッドを使用してsqlステートメントを実行し、テーブルを作成します。- コンソールにテーブル作成成功のメッセージを出力します。
コード:
private static void createTable(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "CREATE TABLE test_commonpool (id INT,name VARCHAR(20))"; statement.executeUpdate(sql); System.out.println("Table created successfully."); } }- プライベート静的メソッド
データを挿入するためのメソッドを定義します。
insertData()という名前のメソッドを定義し、Connectionオブジェクトをパラメータとして受け取ります。具体的な手順は以下のとおりです:- プライベート静的メソッド
insertData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 - 接続の
createStatement()メソッドを使用してStatementオブジェクトを作成し、try-with-resourcesステートメント内でこのオブジェクトを使用してデータベース操作を実行します。 - 文字列変数
sqlを定義し、データ挿入のSQLステートメントを格納します。 StatementオブジェクトのexecuteUpdate()メソッドを使用してsqlステートメントを実行し、データを挿入します。- コンソールにデータ挿入成功のメッセージを出力します。
コード:
private static void insertData(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "INSERT INTO test_commonpool (id, name) VALUES (1,'A1'), (2,'A2'), (3,'A3')"; statement.executeUpdate(sql); System.out.println("Data inserted successfully."); } }- プライベート静的メソッド
データを更新するためのメソッドを定義します。
updateData()という名前のメソッドを定義し、Connectionオブジェクトをパラメータとして受け取ります。具体的な手順は以下のとおりです:- プライベート静的メソッド
updateData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 - 接続の
createStatement()メソッドを使用してStatementオブジェクトを作成し、try-with-resourcesステートメント内でこのオブジェクトを使用してデータベース操作を実行します。 - 文字列変数
sqlを定義し、データ更新のSQLステートメントを格納します。 StatementオブジェクトのexecuteUpdate()メソッドを使用してsqlステートメントを実行し、データを更新します。- コンソールにデータ更新成功のメッセージを出力します。
コード:
private static void updateData(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "UPDATE test_commonpool SET name = 'A11' WHERE id = 1"; statement.executeUpdate(sql); System.out.println("Data updated successfully."); } }- プライベート静的メソッド
データを削除するためのメソッドを定義します。
deleteData()という名前のメソッドを定義し、Connectionオブジェクトをパラメータとして受け取ります。具体的な手順は以下のとおりです:- プライベート静的メソッド
deleteData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 - 接続の
createStatement()メソッドを使用してStatementオブジェクトを作成し、try-with-resourcesステートメント内でこのオブジェクトを使用してデータベース操作を実行します。 - 文字列変数
sqlを定義し、データ削除のSQLステートメントを格納します。 StatementオブジェクトのexecuteUpdate()メソッドを使用してsqlステートメントを実行し、データを削除します。- コンソールにデータ削除成功のメッセージを出力します。
コード:
private static void deleteData(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "DELETE FROM test_commonpool WHERE id = 2"; statement.executeUpdate(sql); System.out.println("Data deleted successfully."); } }- プライベート静的メソッド
データをクエリするためのメソッドを定義します。
selectData()という名前のメソッドを定義し、Connectionオブジェクトをパラメータとして受け取ります。具体的な手順は以下のとおりです:- プライベート静的メソッド
selectData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 - 接続の
createStatement()メソッドを使用してStatementオブジェクトを作成し、try-with-resourcesステートメント内でこのオブジェクトを使用してデータベース操作を実行します。 - 文字列変数
sqlを定義し、データクエリのSQLステートメントを格納します。 StatementオブジェクトのexecuteQuery()メソッドを使用してsqlステートメントを実行し、結果をResultSetオブジェクトに格納します。resultSet.next()メソッドを使用して次の行のデータがあるかどうかを判断し、ループに入ります。resultSet.getInt()メソッドを使用して、データの列名をパラメータとして指定し、現在の行の整数データを取得します。resultSet.getString()メソッドを使用して、データの列名をパラメータとして指定し、現在の行の文字列データを取得します。- コンソールに現在の行のデータを出力します。
コード:
private static void selectData(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "SELECT * FROM test_commonpool"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); } } }- プライベート静的メソッド
テーブルを削除するためのメソッドを定義します。
dropTable()という名前のメソッドを定義し、Connectionオブジェクトをパラメータとして受け取ります。具体的な手順は以下のとおりです:- プライベート静的メソッド
dropTable()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外をスローする可能性があることを宣言します。 - 接続の
createStatement()メソッドを使用してStatementオブジェクトを作成し、try-with-resourcesステートメント内でこのオブジェクトを使用してデータベース操作を実行します。 - 文字列変数
sqlを定義し、テーブル削除のSQLステートメントを格納します。 StatementオブジェクトのexecuteUpdate()メソッドを使用してsqlステートメントを実行し、テーブルを削除します。- コンソールにテーブル削除成功のメッセージを出力します。
コード:
private static void dropTable(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "DROP TABLE test_commonpool"; statement.executeUpdate(sql); System.out.println("Table dropped successfully."); } }- プライベート静的メソッド
ConnectionFactoryクラスを定義します。ConnectionFactoryという名前の静的インナークラスを定義します。このクラスはBasePooledObjectFactoryクラスを継承し、接続オブジェクトの作成と管理を行うメソッドを実装しています。具体的な手順は以下のとおりです:説明
@Overrideはアノテーションであり、以下のメソッドが親クラスのメソッドをオーバーライドしていることを示します。ConnectionFactoryという名前の静的インナークラスを定義します。このクラスはorg.apache.commons.pool2.BasePooledObjectFactory<Connection>を継承し、接続オブジェクトを作成および管理するためのファクトリクラスとして使用されます。- データベースのURLを格納するためのプライベートで不変な文字列変数を定義します。
- データベースに接続するためのユーザー名を格納するためのプライベートで不変な文字列変数を定義します。
- データベースに接続するためのパスワードを格納するためのプライベートで不変な文字列変数を定義します。
ConnectionFactoryクラスのコンストラクタを定義します。このコンストラクタは、クラスのメンバー変数url、username、passwordを初期化するために使用されます。コンストラクタはデータベースのURL、データベース接続用のユーザー名、パスワードという3つのパラメータを受け取り、それぞれの値を対応するメンバー変数に代入します。これにより、ConnectionFactoryオブジェクトを作成する際に、コンストラクタを通じてデータベース関連情報を渡すことができます。BasePooledObjectFactoryクラスのcreate()メソッドをオーバーライドし、新しい接続オブジェクトを作成するために使用します。DriverManagerクラスのgetConnection()メソッドを使用して接続オブジェクトを作成し、返します。BasePooledObjectFactoryクラスのdestroyObject()メソッドをオーバーライドし、接続オブジェクトを破棄するために使用します。- 接続オブジェクトの
close()メソッドを呼び出して接続を閉じます。 BasePooledObjectFactoryクラスのvalidateObject()メソッドをオーバーライドし、接続オブジェクトの有効性を検証するために使用します。- 接続オブジェクトの
isValid()メソッドを呼び出して接続が有効かどうかを確認し、タイムアウト時間を5000ミリ秒に設定します。 BasePooledObjectFactoryクラスのwrap()メソッドをオーバーライドし、接続オブジェクトをPooledObjectオブジェクトにラッピングするために使用します。DefaultPooledObjectクラスのコンストラクタを使用してPooledObjectオブジェクトを作成し、接続オブジェクトをパラメータとして渡します。
コード:
static class ConnectionFactory extends org.apache.commons.pool2.BasePooledObjectFactory<Connection> { private final String url; private final String username; private final String password; public ConnectionFactory(String url, String username, String password) { this.url = url; this.username = username; this.password = password; } @Override public Connection create() throws Exception { return DriverManager.getConnection(url, username, password); } @Override public void destroyObject(org.apache.commons.pool2.PooledObject<Connection> p) throws Exception { p.getObject().close(); } @Override public boolean validateObject(org.apache.commons.pool2.PooledObject<Connection> p) { try { return p.getObject().isValid(5000); } catch (SQLException e) { return false; } } @Override public PooledObject<Connection> wrap(Connection connection) { return new DefaultPooledObject<>(connection); } }
全コード表示
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>commonpool-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
</project>
# Database Configuration
db.url=jdbc:mysql://$host:$port/$database_name?useSSL=false
db.username=$user_name
db.password=$password
# Connection Pool Configuration
pool.maxTotal=10
pool.maxIdle=5
pool.minIdle=2
pool.maxWaitMillis=5000
package com.example;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.PoolUtils;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.commons.pool2.impl.DefaultPooledObject;
public class Main {
public static void main(String[] args) {
// Load the database configuration file
Properties props = new Properties();
try {
props.load(Main.class.getClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
// Create the database connection pool configuration
GenericObjectPoolConfig<Connection> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(Integer.parseInt(props.getProperty("pool.maxTotal")));
poolConfig.setMaxIdle(Integer.parseInt(props.getProperty("pool.maxIdle")));
poolConfig.setMinIdle(Integer.parseInt(props.getProperty("pool.minIdle")));
poolConfig.setMaxWaitMillis(Long.parseLong(props.getProperty("pool.maxWaitMillis")));
// Create the database connection pool
ObjectPool<Connection> connectionPool = PoolUtils.synchronizedPool(new GenericObjectPool<>(new ConnectionFactory(
props.getProperty("db.url"), props.getProperty("db.username"), props.getProperty("db.password")), poolConfig));
// Get a database connection
try (Connection connection = connectionPool.borrowObject()) {
// Create table
createTable(connection);
// Insert data
insertData(connection);
// Query data
selectData(connection);
// Update data
updateData(connection);
// Query the updated data
selectData(connection);
// Delete data
deleteData(connection);
// Query the data after deletion
selectData(connection);
// Drop table
dropTable(connection);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void createTable(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "CREATE TABLE test_commonpool (id INT,name VARCHAR(20))";
statement.executeUpdate(sql);
System.out.println("Table created successfully.");
}
}
private static void insertData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "INSERT INTO test_commonpool (id, name) VALUES (1,'A1'), (2,'A2'), (3,'A3')";
statement.executeUpdate(sql);
System.out.println("Data inserted successfully.");
}
}
private static void updateData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "UPDATE test_commonpool SET name = 'A11' WHERE id = 1";
statement.executeUpdate(sql);
System.out.println("Data updated successfully.");
}
}
private static void deleteData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "DELETE FROM test_commonpool WHERE id = 2";
statement.executeUpdate(sql);
System.out.println("Data deleted successfully.");
}
}
private static void selectData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "SELECT * FROM test_commonpool";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
}
}
private static void dropTable(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "DROP TABLE test_commonpool";
statement.executeUpdate(sql);
System.out.println("Table dropped successfully.");
}
}
static class ConnectionFactory extends org.apache.commons.pool2.BasePooledObjectFactory<Connection> {
private final String url;
private final String username;
private final String password;
public ConnectionFactory(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
@Override
public Connection create() throws Exception {
return DriverManager.getConnection(url, username, password);
}
@Override
public void destroyObject(org.apache.commons.pool2.PooledObject<Connection> p) throws Exception {
p.getObject().close();
}
@Override
public boolean validateObject(org.apache.commons.pool2.PooledObject<Connection> p) {
try {
return p.getObject().isValid(5000);
} catch (SQLException e) {
return false;
}
}
@Override
public PooledObject<Connection> wrap(Connection connection) {
return new DefaultPooledObject<>(connection);
}
}
}
関連ドキュメント
MySQL Connector/Jの詳細については、Overview of MySQL Connector/Jを参照してください。
commonpool-mysql-client サンプルプロジェクトをダウンロード