本記事では、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という名前のパブリッククラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムの開始実行点として、パブリック静的メソッド
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) { // データベース設定ファイルを読み込む Properties props = new Properties(); try { props.load(Main.class.getClassLoader().getResourceAsStream("db.properties")); } catch (IOException e) { e.printStackTrace(); } // データベース接続プールの設定を作成する 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"))); // データベース接続プールを作成する ObjectPool<Connection> connectionPool = PoolUtils.synchronizedPool(new GenericObjectPool<>(new ConnectionFactory( props.getProperty("db.url"), props.getProperty("db.username"), props.getProperty("db.password")), poolConfig)); // データベース接続を取得する try (Connection connection = connectionPool.borrowObject()) { // テーブルを作成する createTable(connection); // データを挿入する insertData(connection); // データをクエリする selectData(connection); // データを更新する updateData(connection); // 更新後のデータをクエリする selectData(connection); // データを削除する deleteData(connection); // 削除後のデータをクエリする selectData(connection); // テーブルを削除する 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を初期化するために使用されます。コンストラクタは3つのパラメータを受け取ります。これらは、それぞれデータベースのURL、データベースに接続するためのユーザー名、パスワードです。これらのパラメータの値を対応するメンバ変数にそれぞれ代入します。これにより、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); } }
全コード表示
# 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
Main.javaのタブ
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の詳細については、MySQL Connector/Jの概要を参照してください。
クリックしてcommonpool-mysql-clientサンプルプロジェクトをダウンロード
Commons Poolを使用したOceanBaseデータベースへの接続サンプルプログラム(MySQLモード)