本記事では、Proxool接続プール、OceanBase Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、削除、更新、クエリなどの基本的なデータベース操作を実現する方法について説明します。
前提条件
OceanBaseデータベースをインストールし、Oracleテナントを作成していること。
JDK 1.8とMavenをインストールしていること。
IntelliJ IDEAをインストールしていること。
説明
このドキュメントでコードを実行するために使用したツールはIntelliJ IDEA Community Edition 2021.3.2です。個人の好みに応じて、適したツールを選択してサンプルコードを実行することもできます。
手順
説明
本記事で示す操作手順は、Windows環境でIntelliJ IDEA Community Edition 2021.3.2を使用してこのプロジェクトをコンパイルおよび実行する場合のものです。他のOS環境やコンパイラを使用する場合は、手順が若干異なる可能性があります。
proxool-oceanbase-clientプロジェクトをIntelliJ IDEAにインポートします。- OceanBaseデータベースのURLを取得します。
proxool-oceanbase-clientプロジェクト内のデータベース接続情報を修正します。proxool-oceanbase-clientプロジェクトを実行します。
ステップ1:proxool-oceanbase-clientプロジェクトをIntelliJ IDEAにインポートする
IntelliJ IDEAを開きます。
ウェルカム画面で、Openオプションをクリックし、プロジェクトのディレクトリに移動して、プロジェクトのルートディレクトリを選択し、OKをクリックします。

IntelliJ IDEAは、プロジェクトのタイプを自動的に検出し、プロジェクトを読み込みます。
説明
IntelliJ IDEAでMavenプロジェクトをインポートすると、IntelliJ IDEAはプロジェクト内の
pom.xmlファイルを自動的に検出し、その記述に基づいて必要な依存ライブラリをダウンロードしてプロジェクトに追加します。
(オプション)未解決の依存関係を手動でインポートします。
pom.xmlファイルに対応する依存関係がすべてプロジェクトに自動的にインポートされている場合は、この手順を無視してください。IntelliJ IDEAのSyncウィンドウのヒントから、
proxool-cglibとproxoolの依存関係が解決されていないことがわかります。proxool-oceanbase-clientプロジェクトのルートディレクトリにあるlibフォルダには、proxool-cglibとproxoolのjarファイルがあります。これらをプロジェクトに追加する手順は以下のとおりです:- IntelliJ IDEAで、File->Project Structureをクリックして、プロジェクト構造の設定に入ります。
- 左側のパネルで、Modulesを選択します。
- 右側のモジュールリストで、Dependenciesタブを選択し、このページの**+**アイコンをクリックして、JARs or directoriesを選択します。
- ポップアップダイアログで、
jarファイルが保存されているlibディレクトリに移動し、jarファイルを選択して、OKをクリックします。 - Dependenciesタブで、新しく追加された
jarファイルがリストに表示されます。 - ApplyまたはOKをクリックして変更を保存します。

ステップ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、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:proxool-oceanbase-clientプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、proxool-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のユーザー名です。 - パスワードは
******です。
コード:
...
jdbc-1.proxool.driver-url=jdbc:oceanbase://xxx.xxx.xxx.xxx:2881/test_schema001
jdbc-1.user=test_user001@oracle001
jdbc-1.password=******
...
ステップ4:proxool-oceanbase-clientプロジェクトを実行する
プロジェクトのナビゲーションバーで、src/main/java/com.example ディレクトリを見つけて展開します。
Main ファイルを右クリックし、Run 'Main.main()' を選択します。
IntelliJ IDEAはプロジェクトを自動的にコンパイルして実行し、実行パネルに出力結果を表示します。

OceanBaseクライアント(OBClient)で以下のSQLステートメントを実行して結果を確認することもできます。
obclient [TEST_USER001]> SELECT * FROM test_schema001.test_proxool;戻り結果は次のとおりです:
+------+---------------+ | C1 | C2 | +------+---------------+ | 6 | test_update | | 7 | test_insert7 | | 8 | test_insert8 | | 9 | test_insert9 | | 10 | test_insert10 | +------+---------------+ 5 rows in set
プロジェクトコードについて
proxool-oceanbase-client をクリックしてプロジェクトコードをダウンロードします。これは、proxool-oceanbase-client.zip という名前の圧縮ファイルです。
解凍すると、proxool-oceanbase-client という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
proxool-oceanbase-client
├── lib
│ ├── proxool-0.9.1.jar
│ └── proxool-cglib.jar
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
ファイルの説明:
lib:プロジェクトに必要な依存ライブラリファイルを格納します。proxool-0.9.1.jar:Proxool接続プールライブラリファイル。proxool-cglib.jar:Proxool接続プールをサポートするためのCGLibライブラリファイル。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>を使用して、プロジェクトの名前をproxool-oceanbase-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>com.example</groupId> <artifactId>proxool-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と指定します。
<main id="notice" type='explain'> <h4>説明</h4> <p>このセクションのコードは、プロジェクトが依存するコンポーネントがOceanBase Connector/JのV2.4.2バージョンであることを定義しています。他のバージョンの情報については、<a href="https://en.oceanbase.com/docs/oceanbase-connector-j-en">OceanBase JDBCドライバ</a> を参照してください。</p> </main> **コード:** ```java <dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.2</version> </dependency> ```proxool-cglib依存ライブラリを追加し、Proxool接続プールをサポートするCGLibライブラリとして使用します:<groupId>を使用して、依存関係が属する組織をproxoolと指定します。<artifactId>を使用して、依存関係の名前をproxool-cglibと指定します。<version>を使用して、依存関係のバージョン番号を0.9.1と指定します。
**コード:** ```java <dependency> <groupId>proxool</groupId> <artifactId>proxool-cglib</artifactId> <version>0.9.1</version> </dependency> ```proxool依存ライブラリを追加します。これはProxool接続プールのコアライブラリです:<groupId>を使用して、依存関係が属する組織をproxoolと指定します。<artifactId>を使用して、依存関係の名前をproxoolと指定します。<version>を使用して、依存関係のバージョン番号を0.9.1と指定します。
**コード:** ```java <dependency> <groupId>proxool</groupId> <artifactId>proxool</artifactId> <version>0.9.1</version> </dependency> ```commons-logging依存ライブラリを追加します。これはアプリケーションでログ記録を行うための汎用ログライブラリです:<groupId>を使用して、依存関係が属する組織をcommons-loggingと指定します。<artifactId>を使用して、依存関係の名前をcommons-loggingと指定します。<version>を使用して、依存関係のバージョン番号を1.2と指定します。
**コード:** ```java <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> ```
db.propertiesコードの紹介
db.properties は本記事の例となる接続プールの設定ファイルであり、接続プールの設定プロパティが含まれています。
説明
.properties ファイルを使用してProxool接続プールを設定する場合、以下のルールに従う必要があります:
jdbcをプレフィックスとするカスタム名を使用して各接続プールを識別します。この名前はカスタマイズ可能で、各接続プールを一意に識別するために使用されます。- Proxool接続プールに関連するプロパティは
proxool.をプレフィックスとし、これらのプロパティはProxool接続プール自体のプロパティを設定するために使用されます。 jdbcをプレフィックスとしないプロパティは無視され、Proxoolでは使用されません。proxool.をプレフィックスとしないプロパティは実際のデータベース接続に渡され、つまりこれらのプロパティは実際のデータベースドライバーに渡されます。
本記事の db.properties ファイルは、jdbc-1 という名前のデータソースの接続プールプロパティを設定するためのプロパティファイルの例です。主に以下の部分が含まれます:
データソースのエイリアスを
TESTに設定します。コード:
jdbc-1.proxool.alias=TESTデータベース接続パラメータを設定します。
- ドライバーのクラス名を設定します。ここでは、OceanBase JDBCドライバーのクラス名
com.oceanbase.jdbc.Driverです。 - データベース接続のURLを設定します。ホストIP、ポート番号、アクセスするSchemaを含みます。
- データベースのユーザー名を設定します。
- データベースのパスワードを設定します。
コード:
jdbc-1.proxool.driver-class=com.oceanbase.jdbc.Driver jdbc-1.proxool.driver-url=jdbc:oceanbase://$host:$port/$schema_name jdbc-1.user=$user_name jdbc-1.password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPを提供します。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポートを提供します。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$schema_name:アクセスするSchema名です。$user_name:テナントの接続アカウントを提供します。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワードを提供します。
- ドライバーのクラス名を設定します。ここでは、OceanBase JDBCドライバーのクラス名
その他のProxool接続プールのパラメータを設定します。
- 接続プールの最大接続数を8に設定します。
- 接続プールの最小接続数を5に設定します。
- 接続プールで利用可能な接続数を4に設定します。
- 接続プールの詳細モードを有効に設定します。これにより、より多くのログ情報が表示されます。
- 接続プールの統計情報記録間隔を10秒、1分、1日に設定します。
- 接続プール統計情報記録のログレベルをエラーレベルに設定します。
コード:
jdbc-1.proxool.maximum-connection-count=8 jdbc-1.proxool.minimum-connection-count=5 jdbc-1.proxool.prototype-count=4 jdbc-1.proxool.verbose=true jdbc-1.proxool.statistics=10s,1m,1d jdbc-1.proxool.statistics-log-level=error
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整および設定を行うことを推奨します。Proxool接続プールパラメータの詳細については、Propertiesを参照してください。
よく使われる設定パラメータの説明:
パラメータ |
デフォルト値 |
説明 |
|---|---|---|
| alias | N/A | 接続プールのエイリアスを設定します。接続プールを識別するために使用でき、複数の接続プールが存在する場合に役立ちます。 |
| driver-class | N/A | データベースドライバークラス名を設定します。 |
| driver-url | N/A | データベース接続URLを設定します。ホストIPアドレス、ポート番号、アクセスするスキーマ、およびオプションのデータベースドライバーパラメータを含みます。 |
| username | N/A | データベースのユーザー名を設定します。 |
| password | N/A | データベースのパスワードを設定します。 |
| maximum-connection-count | 15 | 接続プールの最大接続数を設定します。デフォルト値は15で、接続プールが作成できる接続の最大数は15であることを意味します。 |
| minimum-connection-count | 5 | 接続プールの最小接続数を設定します。デフォルト値は5で、接続プールが常に少なくとも5つの接続を保持することを意味します。 |
| prototype-count | 0 | 接続プールのプロトタイプ接続数を設定します。デフォルト値は0で、接続プールが追加の接続を自動的に作成しないことを意味します。 |
| verbose | false | 接続プールの詳細出力モードを設定します。デフォルト値はfalse、つまりサイレントモードです。verbose プロパティを true に設定すると、接続プールは開発者のデバッグや監視を容易にするために、より詳細な情報を出力します。この情報には、接続プールの状態、接続の作成と解放、接続の使用状況などが含まれる可能性があります。verbose モードを有効にすると、開発者は接続プールの動作状況をより深く理解し、接続の割り当てと回収が正常に行われているか確認できます。これは、接続リーク、パフォーマンス問題、チューニングのトラブルシューティングに非常に役立ちます。本番環境では、通常 verbose を true に設定することは推奨されません。大量の出力情報が生成され、システムのパフォーマンスやログファイルのサイズに影響を与える可能性があるためです。一般的に、verbose を false に設定し、必要な場合にのみ一時的にデバッグや監視のために有効にすることを推奨します。 |
| statistics | null | 統計情報のサンプリング間隔、つまり接続プールの使用状況統計を設定します。サンプリング間隔はカンマ区切りの時間単位で設定できます。例えば、10s,15m は10秒ごとと15分ごとにサンプリングすることを意味します。利用可能な単位は s(秒)、m(分)、h(時間)、d(日)です。デフォルト値は null で、統計情報を収集しないことを意味します。statistics プロパティを設定すると、接続プールはアクティブ接続数、アイドル接続数、接続リクエスト数などの統計情報を定期的にサンプリングします。サンプリング間隔は統計情報の粒度とサンプリング頻度を決定します。 |
| statistics-log-level | null | 統計情報のログレベル、つまりログ統計の追跡タイプを設定します。選択可能なログレベルは DEBUG、INFO、WARN、ERROR、FATAL です。デフォルト値は null で、統計情報のログを記録しないことを意味します。statistics-log-level プロパティを設定すると、接続プールは生成された統計情報を指定されたログレベルで記録します。これらの統計情報には、接続プールの状態、接続の作成と解放、接続の使用状況などが含まれる可能性があります。 |
| test-after-use | N/A | 接続を閉じた後にテストを実行するかどうかを設定します。このプロパティを true に設定し、house-keeping-test-sql プロパティを定義している場合、各接続は閉じられる(つまり接続プールに返却される)際にテストされます。接続テストに失敗した場合、その接続は破棄されます。接続プール内の接続は、使用後は通常接続プールに戻され、再利用されます。 test-after-use プロパティの役割は、接続が接続プールに戻された後、その接続の可用性と有効性を確認するためにテストを行うことです。接続テストでは、通常 house-keeping-test-sql プロパティで指定されたSQLステートメントが使用されます。test-after-use 機能を有効にすることで、接続プールは使用不能な接続を迅速に検出し、接続プールから削除することができます。これにより、アプリケーションが無効な接続を取得するのを防ぎ、アプリケーションの安定性と信頼性を向上させることができます。test-after-use 機能を使用するには、事前に house-keeping-test-sql プロパティを設定する必要がある点に注意してください。このプロパティは、接続テストで使用するSQLステートメントを定義するために使用されます。これにより、接続プールは house-keeping-test-sql で定義されたルールに基づいて接続をテストし、判断することができます。 |
| house-keeping-test-sql | N/A | 接続プール内のアイドル接続をテストするSQLステートメントを設定します。接続プールのハウスキーピングスレッドがアイドル接続を検出すると、このSQLステートメントを使用してそれらの接続をテストします。テストSQLステートメントは、現在日時を確認するなど、非常に高速に実行されるものである必要があります。このプロパティが定義されていない場合、接続テストは行われません。MySQLモードでは SELECT CURRENT_DATE または SELECT 1 を使用できます。Oracleモードでは SELECT sysdate FROM DUAL または SELECT 1 FROM DUAL を使用できます。 |
| trace | false | 各SQL呼び出しのログ情報を記録するかどうかを設定します。true に設定すると、各SQL呼び出しがログに記録され(DEBUG レベル)、実行時間が表示されます。ConnectionListener(ProxoolFacade を参照)を登録することでもこれらの情報を取得できます。デフォルト値は false です。trace 機能を有効にすると、特に高並行性や頻繁なSQL呼び出しの環境では、大量のログ出力が発生する可能性があります。本番環境では、過度なログ生成やシステム性能への不要な影響を避けるため、慎重に使用することを推奨します。 |
| maximum-connection-lifetime | 4時間 | 接続の最大ライフタイムを設定します。つまり、接続が破棄されるまでに存在できる最長時間(ミリ秒単位)です。デフォルト値は4時間です。 接続のライフタイムとは、接続が作成されてから破棄されるまでの期間を指します。 maximum-connection-lifetime プロパティを設定することで、接続が接続プール内に存在できる最長時間を制限し、接続が長時間使用されない状態やリソースリークを防ぐことができます。 |
| maximum-active-time | 5分 | スレッドの最大アクティブ時間を設定します。接続プールのハウスキーピングスレッドが、あるスレッドのアクティブ時間がこの設定を超えたことを検出すると、そのスレッドを終了させます。そのため、このプロパティは想定される最遅応答時間よりも大きい値に設定する必要があります。デフォルト値は5分です。 デーモンは、接続プール内の余分な利用可能スレッド(未使用で、この時間を超えたもの)を終了させ、最終的に保持される接続数は minimum-connection-count で指定された数になります。デーモンは house-keeping-sleep-time パラメータで設定された間隔で定期的にチェックを行います。 |
| maximum-new-connections | N/A | 接続プールが一度に同時に確立できる最大新規接続数を設定します。このプロパティは非推奨(Deprecated)です。代わりに simultaneous-build-throttle プロパティの使用を推奨します。 |
| simultaneous-build-throttle | 10 | 接続プールが任意の時点で同時に確立できる最大接続数を設定します。つまり、確立されようとしているがまだ利用できない新規接続数の上限です。接続の確立には複数のスレッドが使用される場合があり(例:オンデマンドで接続を確立する場合)、接続の確立を決定してから接続が利用可能になるまでに一定の時間がかかるため、多数のスレッドが同時に接続確立を決定することを防ぐ方法が必要です。simultaneous-build-throttle プロパティの役割は、接続プールが同時に確立する新規接続数を制限し、接続プールの並行性を制御することです。最大同時接続数に達すると、新規接続を要求するスレッドは、利用可能な接続が出現するか、指定されたタイムアウト時間を超えるまでブロックされます。適切な simultaneous-build-throttle プロパティを設定することで、接続プールの並行性とリソース消費のバランスを取ることができます。デフォルト値は10で、接続プールが同時に確立できる最大接続数が10であることを意味します。 |
| overload-without-refusal-lifetime | 60 | 接続プールの状態を判断するために使用されます。指定された時間しきい値(ミリ秒単位)内に接続リクエストが拒否された場合、接続プールは過負荷状態にあることを示します。デフォルト値は60秒です。 |
| test-before-use | N/A | 接続を提供する前に各接続をテストするかどうかを設定します。このプロパティを true に設定すると、アプリケーションに接続を提供する前に、各接続は事前定義されたテストSQL(house-keeping-test-sql プロパティで定義)を実行してテストされます。接続テストに失敗した場合、その接続は破棄され、接続プールは別の利用可能な接続を選択します。すべての接続がテストに失敗した場合、新しい接続が作成されます。新しい接続のテストも失敗した場合、SQLException がスローされます。注意点として、MySQLデータベースでは接続パラメータに autoReconnect=true パラメータを追加する必要があります。そうしないと、test-before-use パラメータを有効にしても再接続できません。 |
| fatal-sql-exception | null | SQL例外の検出と処理を設定します。これはカンマ区切りのメッセージフラグメントのリストです。SQLException が発生した場合、そのメッセージはこれらのメッセージフラグメントと比較されます。いずれかのメッセージフラグメント(大文字小文字を区別)を含む場合、致命的なSQL例外と見なされ、接続は破棄されます。いずれにしても、例外は再スローされ、ユーザーが何が起こったかを理解できるようになります。異なる例外をスローするように設定することもできます(fatal-sql-exception-wrapper-class プロパティを参照)。デフォルト値は null です。fatal-sql-exception-wrapper-class プロパティを設定した場合、スローされる代替の例外クラスを構成できる点に注意してください。これにより、SQL例外の処理方法をカスタマイズできます。 |
| fatal-sql-exception-wrapper-class | null | 致命的なSQL例外の例外ラッピングを設定します。fatal-sql-exception プロパティが設定されている場合、デフォルトの動作は致命的な SQLException を引き起こした例外を破棄し、元の例外をユーザーに直接スローすることです。このプロパティを使用すると、SQLException を別の例外でラッピングできます。この例外は、SQLException または RuntimeException から派生している限り、任意のクラスにすることができます。Proxoolは、例外クラスを自分で構築したくない場合に使用できる2つのクラスを提供しています:FatalSQLException と FatalRuntimeException。これらのクラスを使用するには、必要に応じてこのプロパティを org.logicalcobwebs.proxool.FatalSQLException または org.logicalcobwebs.proxool.FatalRuntimeException に設定する必要があります。デフォルト値は null で、致命的な SQLException をラッピングしないことを意味します。デフォルト値は null です。例外ラッピングクラスは SQLException または RuntimeException のサブクラスである必要がある点に注意してください。 |
| house-keeping-sleep-time | 30秒 | 接続プールのハウスキーピングスレッド(house keeping thread)のスリープ時間を設定します。ハウスキーピングスレッドは、すべての接続の状態をチェックし、接続を破棄または作成する必要があるかどうかを判断します。デフォルト値は30秒で、ハウスキーピングスレッドが30秒ごとにメンテナンスタスクを実行することを意味します。 |
| injectable-connection-interface | N/A | Proxoolが委譲されたConnectionオブジェクトで定義されたメソッドを実装できるようにするために使用します。 |
| injectable-statement-interface | N/A | Proxoolが委譲されたStatementオブジェクトで定義されたメソッドを実装できるようにするために使用します。 |
| injectable-prepared-statement-interface | N/A | Proxoolが委譲されたPreparedStatementオブジェクトで定義されたメソッドを実装できるようにするために使用します。 |
| injectable-callable-statement-interface | N/A | Proxoolが委譲されたCallableStatementオブジェクトで定義されたメソッドを実装できるようにするために使用します。 |
| jndi-name | N/A | 接続プールがJNDI (Java Naming and Directory Interface) に登録する名前を指定するために使用します。 |
Main.javaコードの紹介
Main.java ファイルはサンプルプログラムの一部であり、Proxool接続プールを使用してデータベース接続を取得し、テーブルの作成、データの挿入、削除、更新、クエリといった一連のデータベース操作を実行し、その結果を出力する方法を示しています。
本記事の Main.java ファイルのコードは、主に以下の部分で構成されています:
必要なクラスとインターフェースのインポート。
コードが存在するパッケージを定義し、ProxoolおよびJDBC関連のクラスをインポートします。これらのクラスは、データベース接続プールの設定と管理、およびSQL文の実行に使用されます。Proxool接続プールを使用することで、データベース操作のパフォーマンスと信頼性を向上させることができます。具体的な手順は以下の通りです:
- コードが存在するパッケージを
com.exampleと定義します。このパッケージは現在のJavaクラスを格納するために使用されます。 - Proxoolの設定クラス
org.logicalcobwebs.proxool.configuration.PropertyConfiguratorをインポートします。 - 設定ファイルを読み取るための入力ストリームクラス
java.io.InputStreamをインポートします。 - JDBCのConnectionクラス
java.sql.Connectionをインポートします。 - JDBCのDriverManagerクラス
java.sql.DriverManagerをインポートします。 - JDBCのResultSetクラス
java.sql.ResultSetをインポートします。 - JDBCのStatementクラス
java.sql.Statementをインポートします。 - 設定ファイルを読み込むための Propertiesクラス
java.util.Propertiesをインポートします。
コード:
package com.example; import org.logicalcobwebs.proxool.configuration.PropertyConfigurator; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties;- コードが存在するパッケージを
クラス名とメソッドの定義。
Javaプログラムのエントリーメソッドを定義します。このメソッドでは、設定ファイルからデータベース接続情報を取得し、Proxoolドライバを使用してデータベース接続を確立した後、定義済みのメソッドを順次呼び出してDDLステートメント、DMLステートメント、クエリステートメントを実行します。発生する可能性のある例外情報をキャッチして出力します。このコードの目的は、データベース関連の操作を実行し、ログレコーダーを使用してログを記録することです。具体的な手順は以下の通りです:
Mainという名前のpublicクラスを定義します。
データベース設定(プロパティ)ファイルのパスを表す、
DB_PROPERTIES_FILEという名前のプライベート静的定数を定義します。この定数はコード内で参照することができ、プロパティファイルの読み込みと読み取りに使用されます。プログラムの実行開始点として、public staticメソッド
mainを定義します。例外が発生する可能性のあるコードブロックをキャッチします。
- 設定ファイルのプロパティを読み取るために使用される
Propertiesオブジェクトを作成します。 - Mainクラスのクラスローダーを使用して、設定ファイルの入力ストリームを取得します。
- 読み込んだ入力ストリームを使用して設定ファイルを読み込み、プロパティを
Propertiesオブジェクトにロードします。 - 読み込んだプロパティを使用して接続プールを設定します。
- Proxoolデータベースドライバを動的にロードします。
- Proxoolドライバを使用してデータベース接続を確立します。
Statementオブジェクトを作成します。- DDLステートメントを実行するために定義済みのメソッド
executeDDLStatements()を呼び出します。これはテーブルを作成する操作です。 - DMLステートメントを実行するために定義済みのメソッド
executeDMLStatements()を呼び出します。これはデータの挿入、更新、削除を行う操作です。 - クエリステートメントを実行してデータを取得するために、定義済みのメソッド
executeQueryStatements()を呼び出します。
- 設定ファイルのプロパティを読み取るために使用される
発生する可能性のある例外情報をキャッチして出力します。
テーブルの作成、DMLステートメントの実行、データのクエリを行うためのメソッドを定義します。
コード:
public class Main { private static final String DB_PROPERTIES_FILE = "/db.properties"; public static void main(String[] args) { try { Properties properties = new Properties(); InputStream is = Main.class.getResourceAsStream(DB_PROPERTIES_FILE); properties.load(is); PropertyConfigurator.configure(properties); Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); try (Connection conn = DriverManager.getConnection("proxool.TEST"); Statement stmt = conn.createStatement()) { executeDDLStatements(stmt); executeDMLStatements(stmt); executeQueryStatements(stmt); } } catch (Exception e) { e.printStackTrace(); } } // テーブルを作成するためのメソッドを定義する // DMLステートメントを実行するためのメソッドを定義する // データをクエリするためのメソッドを定義する }テーブルを作成するためのメソッドを定義します。
プライベート静的メソッド
executeDDLStatements()を定義します。これは、テーブル作成ステートメントを含むDDL(データ定義言語)ステートメントを実行するために使用されます。具体的な手順は以下の通りです:- プライベート静的メソッド
executeDDLStatements()を定義します。このメソッドはStatementオブジェクトをパラメータとして受け取り、Exception例外をスローする可能性があります。 execute()メソッドを使用してSQLステートメントを実行し、test_proxoolという名前のテーブルを作成します。このテーブルにはc1とc2の2つの列があり、それぞれNUMBER型とVARCHAR2(32)型です。
コード:
private static void executeDDLStatements(Statement stmt) throws Exception { stmt.execute("CREATE TABLE test_proxool (c1 NUMBER, c2 VARCHAR2(32))"); }- プライベート静的メソッド
DMLステートメントを実行するためのメソッドを定義します。
プライベート静的メソッド
executeDMLStatements()を定義します。これは、データの挿入、削除、更新を行うDML(データ操作言語)ステートメントを実行するために使用されます。具体的な手順は以下の通りです:- プライベート静的メソッド
executeDMLStatements()を定義します。このメソッドはStatementオブジェクトをパラメータとして受け取り、実行中に例外が発生した場合、メソッドはException例外をスローします。 forループを使用して、1から10まで反復します。ループ内で、execute()メソッドを使用してSQL挿入ステートメントを実行し、変数iと関連する文字列値をtest_proxoolテーブルに挿入します。- SQL削除ステートメントを実行し、
test_proxoolテーブルからc1列の値が5以下の行を削除します。 - SQL更新ステートメントを実行し、
test_proxoolテーブルのc1列の値が6の行のc2列をtest_updateに更新します。
コード:
private static void executeDMLStatements(Statement stmt) throws Exception { for (int i = 1; i <= 10; i++) { stmt.execute("INSERT INTO test_proxool VALUES (" + i + ",'test_insert" + i + "')"); } stmt.execute("DELETE FROM test_proxool WHERE c1 <= 5"); stmt.execute("UPDATE test_proxool SET c2 = 'test_update' WHERE c1 = 6"); }- プライベート静的メソッド
データをクエリするためのメソッドを定義します。
プライベート静的メソッド
executeQueryStatements()を定義します。これは、SELECTクエリステートメントを実行し、結果を処理するために使用されます。具体的な手順は以下の通りです:- プライベート静的メソッド
executeQueryStatements()を定義します。このメソッドはStatementオブジェクトをパラメータとして受け取り、実行中に例外が発生した場合、メソッドはException例外をスローします。 executeQuery()メソッドを使用してSELECTクエリステートメントを実行し、結果をResultSetオブジェクトrsに格納します。ここでは、クエリはtest_proxoolテーブルのすべてのデータを返します。try-with-resourcesステートメントを使用して、ResultSetの使用後に自動的に閉じられるようにします。whileループとnext()メソッドを使用して、ResultSetオブジェクトrs内の各行データを反復処理します。各反復で、rs.next()メソッドはポインタを結果セットの次の行に移動します。次の行のデータが利用可能な場合、このメソッドはtrueを返し、そうでない場合はfalseを返します。whileループ内では、rs.next()がtrueを返す限り、まだ利用可能な行データがあることを意味します。ループ体のコードが実行され、現在の行のデータが処理されます。すべての行のデータが処理された後、rs.next()はfalseを返し、ループ終了となります。getInt()とgetString()メソッドを使用して、現在の行の指定された列名の値を取得し、コンソールに出力します。ここでは、c1列とc2列の値が出力されます。getInt()メソッドは整数値を取得するために使用され、getString()メソッドは文字列値を取得するために使用されます。
コード:
private static void executeQueryStatements(Statement stmt) throws Exception { try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_proxool")) { while (rs.next()) { System.out.println(rs.getInt("c1") + " " + rs.getString("c2")); } } }- プライベート静的メソッド
全コード表示
<?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.oceanbase</groupId>
<artifactId>proxool-oceanbase-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>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>proxool</groupId>
<artifactId>proxool-cglib</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>proxool</groupId>
<artifactId>proxool</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
#alias: the alias of the data source
jdbc-1.proxool.alias=TEST
#driver-class: driver name
jdbc-1.proxool.driver-class=com.oceanbase.jdbc.Driver
#driver-url: url connection string, username and password must be determined
jdbc-1.proxool.driver-url=jdbc:oceanbase://$host:$port/$schema_name
jdbc-1.user=$user_name
jdbc-1.password=$password
#The maximum number of database connections. The default is 15
jdbc-1.proxool.maximum-connection-count=8
#The minimum number of database connections, defaults to 5
jdbc-1.proxool.minimum-connection-count=5
#The number of available connections in the Connection pool. If the number of connections in the current Connection pool is less than this value, new connections will be established (assuming that the maximum number of available connections is not exceeded). For example, if we have three active connections and two available connections, and our prototype count is 4, the database Connection pool will try to establish another two connections. This is different from the minimum connection count Minimum connection count also counts active connections. Prototype count is the number of spare connections
jdbc-1.proxool.prototype-count=4
#verbose: detailed information settings. Parameter bool value
jdbc-1.proxool.verbose=true
#statistics: connection pool usage statistics. Parameter "10s, 1m, 1d"
jdbc-1.proxool.statistics=10s,1m,1d
#statistics-log-level: log statistics tracking type. Parameter 'ERROR' or 'INFO'
jdbc-1.proxool.statistics-log-level=error
package com.example;
import org.logicalcobwebs.proxool.configuration.PropertyConfigurator;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class Main {
private static final String DB_PROPERTIES_FILE = "/db.properties";
public static void main(String[] args) {
try {
Properties properties = new Properties();
InputStream is = Main.class.getResourceAsStream(DB_PROPERTIES_FILE);
properties.load(is);
PropertyConfigurator.configure(properties);
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
try (Connection conn = DriverManager.getConnection("proxool.TEST");
Statement stmt = conn.createStatement()) {
executeDDLStatements(stmt);
executeDMLStatements(stmt);
executeQueryStatements(stmt);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void executeDDLStatements(Statement stmt) throws Exception {
stmt.execute("CREATE TABLE test_proxool (c1 NUMBER, c2 VARCHAR2(32))");
}
private static void executeDMLStatements(Statement stmt) throws Exception {
for (int i = 1; i <= 10; i++) {
stmt.execute("INSERT INTO test_proxool VALUES ("+ i +",'test_insert" + i + "')");
}
stmt.execute("DELETE FROM test_proxool WHERE c1 <= 5");
stmt.execute("UPDATE test_proxool SET c2 = 'test_update' WHERE c1 = 6");
}
private static void executeQueryStatements(Statement stmt) throws Exception {
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_proxool")) {
while (rs.next()) {
System.out.println(rs.getInt("c1") + " " + rs.getString("c2"));
}
}
}
}
関連ドキュメント
- OceanBase Connector/Jの詳細については、OceanBase JDBCドライバを参照してください。
- Proxool接続プールの詳細については、Introduction for Usersを参照してください。
クリックしてproxool-oceanbase-clientサンプルプロジェクトをダウンロード