本記事では、Commons Pool、OceanBase Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、更新、削除、クエリ、およびテーブルの削除など、基本的なデータベース操作を実現する方法について説明します。
前提条件
OceanBaseデータベースをインストールし、Oracleモードのテナントを作成済みであること。
JDK 1.8とMavenをインストール済みであること。
Eclipseをインストール済みであること。
説明
このドキュメントでは、Eclipse IDE for Java Developers 2022-03バージョンを使用してコードを実行しますが、ご自身の好みに合わせて適したツールを選択してサンプルコードを実行することもできます。
手順
説明
本記事で示されている操作手順は、Windows環境におけるEclipse IDE for Java Developers 2022-03を使用してこのプロジェクトをコンパイルおよび実行する方法です。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
commonpool-oceanbase-clientプロジェクトをEclipseにインポートします。- OceanBaseデータベースのURLを取得します。
commonpool-oceanbase-clientプロジェクト内のデータベース接続情報を修正します。commonpool-oceanbase-clientプロジェクトを実行します。
ステップ1:commonpool-oceanbase-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@oracel001 -p******詳細な接続文字列については、OBClientを使用したOceanBaseテナントへの接続を参照してください。
OceanBaseデータベースの接続文字列に基づいて、以下のURLに該当する情報を入力します。
jdbc:oceanbase://$host:$port/$schema_name?user=$user_name&password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$schema_name:アクセス対象のスキーマ名。注意
テナントに接続するユーザーには、
CREATE SESSION権限と、そのスキーマに対するCREATE TABLE、DROP TABLE、INSERT、DELETE、UPDATEおよびSELECT権限が必要です。ユーザー権限の詳細については、Oracleモードにおける権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
OceanBase Connector/J URLパラメータの詳細については、データベースURLを参照してください。
例:
jdbc:oceanbase://xxx.xxx.xxx.xxx:2881/test_schema001?user=test_user001@oracel001&password=******
ステップ3:commonpool-oceanbase-clientプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、commonpool-oceanbase-client/src/main/resources/db.properties ファイル内のデータベース接続情報を修正します。

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

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

プロジェクトコードについて
commonpool-oceanbase-client をクリックしてプロジェクトコードをダウンロードします。これは、commonpool-oceanbase-client.zip という名前の圧縮ファイルです。
解凍すると、commonpool-oceanbase-client という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
commonpool-oceanbase-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-oceanbase-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>com.example</groupId> <artifactId>commonpool-oceanbase-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>プロジェクトが依存するコンポーネントを設定します。
データベースとのインタラクションを行うために、
oceanbase-client依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をcom.oceanbaseと指定します。<artifactId>を使用して、依存関係の名前をoceanbase-clientと指定します。<version>を使用して、依存関係のバージョン番号を2.4.2と指定します。
説明
このセクションのコードでは、プロジェクトが依存するコンポーネントとしてOceanBase Connector/JのV2.4.2バージョンを定義しています。他のバージョンの情報については、OceanBase JDBCドライバーを参照してください。
コード:
<dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.2</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:oceanbase://$host:$port/$schema_name db.username=$user_name db.password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレスを提供します。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポートを提供します。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$schema_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 NUMBER,name VARCHAR2(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:oceanbase://$host:$port/$schema_name
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 NUMBER,name VARCHAR2(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);
}
}
}
参照ドキュメント
OceanBase Connector/Jの詳細については、OceanBase JDBCドライバーを参照してください。
クリックしてcommonpool-oceanbase-clientサンプルプロジェクトをダウンロード
Commons Poolを使用したOceanBaseデータベースへの接続サンプルプログラム(Oracleモード)