本ドキュメントでは、Proxoolコネクションプール、MySQL Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、削除、更新、クエリなどの基本的なデータベース操作を実装する方法について説明します。
前提条件
-
OceanBase Cloudアカウントを登録し、クラスタインスタンスとOceanBase CloudのMySQLテナントを作成していること。詳細は、クラスタインスタンスの作成およびテナントの作成をご参照ください。
対象のMySQL互換モードテナントの接続文字列を取得していること。詳細な手順については、接続文字列の取得をご参照ください。
JDK 1.8およびMavenをインストールしていること。
IntelliJ IDEAをインストールしていること。
説明
本ドキュメントでコードを実行するために使用しているツールはIntelliJ IDEA Community Edition 2021.3.2バージョンですが、個人の好みに応じて適切なツールを選択してサンプルコードを実行することもできます。
操作手順
<main id="notice" type='explain'>
<h4>説明</h4>
<p>本ドキュメントに記載されている手順は、Windows環境でIntelliJ IDEA Community Edition 2021.3.2を使用してプロジェクトをコンパイルおよび実行する手順です。他のオペレーティングシステム環境やコンパイラを使用している場合、手順が若干異なる場合があります。</p>
</main>
操作手順1:proxool-mysql-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-mysql-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:proxool-mysql-clientプロジェクトのデータベース接続情報を変更する
前提条件で取得した接続文字列情報に基づいて、ファイル proxool-mysql-client/src/main/resources/db.properties 内のデータベース接続情報を変更します。
例は以下の通りです:
- 接続アドレスは
t5******.********.oceanbase.cloudです。 - アクセスポートは 3306 を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
test_userです。 - パスワードは
******です。
コードは以下の通りです:
...
jdbc-1.proxool.driver-url=jdbc:mysql://t5******.********.oceanbase.cloud:3306/test?useSSL=false
jdbc-1.user=test_user
jdbc-1.password=******
...
操作手順4:proxool-mysql-clientプロジェクトを実行する
プロジェクトナビゲーションバーで、src/main/java/com.example ディレクトリを見つけて展開します。
Main ファイルを右クリックし、Run 'Main.main()' を選択します。
IntelliJ IDEAはプロジェクトを自動的にコンパイルして実行し、実行パネルに出力結果を表示します。
OceanBaseクライアント(OBClient)で以下のSQL文を実行して結果を確認することもできます。
obclient [(none)]> SELECT * FROM test.test_proxool;返される結果は以下の通りです:
+------+---------------+ | c1 | c2 | +------+---------------+ | 6 | test_update | | 7 | test_insert7 | | 8 | test_insert8 | | 9 | test_insert9 | | 10 | test_insert10 | +------+---------------+ 5 rows in set
プロジェクトコードの紹介
proxool-mysql-client をクリックしてプロジェクトコードをダウンロードします。これは proxool-mysql-client.zip という名前の圧縮パッケージです。
解凍すると、proxool-mysql-client という名前のフォルダが作成されます。ディレクトリ構造は以下の通りです:
proxool-mysql-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ファイルの場所を に、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-mysql-clientに指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTに指定します。
コードは以下の通りです:
<groupId>com.example</groupId> <artifactId>proxool-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>プロジェクトが依存するコンポーネントを設定します。
<dependency>を使用して依存関係を定義します:データベースの接続と操作に使用する
mysql-connector-javaライブラリを追加します:<groupId>を使用して、依存関係が属する組織をmysqlに指定します。<artifactId>を使用して、依存関係の名前をmysql-connector-javaに指定します。<version>を使用して、依存関係のバージョン番号を5.1.47に指定します。
コードは以下の通りです:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>ProxoolコネクションプールをサポートするCGLibライブラリである
proxool-cglib依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をproxoolに指定します。<artifactId>を使用して、依存関係の名前をproxool-cglibに指定します。<version>を使用して、依存関係のバージョン番号を0.9.1に指定します。
コードは以下の通りです:
<dependency> <groupId>proxool</groupId> <artifactId>proxool-cglib</artifactId> <version>0.9.1</version> </dependency>Proxoolコネクションプールのコアライブラリである
proxool依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をproxoolに指定します。<artifactId>を使用して、依存関係の名前をproxoolに指定します。<version>を使用して、依存関係のバージョン番号を0.9.1に指定します。
コードは以下の通りです:
<dependency> <groupId>proxool</groupId> <artifactId>proxool</artifactId> <version>0.9.1</version> </dependency>アプリケーションでログ記録を行うための汎用ログライブラリである
commons-logging依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をcommons-loggingに指定します。<artifactId>を使用して、依存関係の名前をcommons-loggingに指定します。<version>を使用して、依存関係のバージョン番号を1.2に指定します。
コードは以下の通りです:
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
db.propertiesコードの紹介
db.properties は本ドキュメントのサンプルのコネクションプール設定ファイルであり、コネクションプールの設定属性が含まれています。
<main id="notice" type='explain'>
<h4>説明</h4>
<p><code>.properties</code> ファイルを使用してProxoolコネクションプールを設定する場合、以下の規則に従う必要があります: <ol><li>各コネクションプールを識別するために、<code>jdbc</code> をプレフィックスとするカスタム名を使用します。この名前はカスタマイズ可能であり、各コネクションプールを一意に識別するために使用されます。</li><li>Proxoolコネクションプールの関連属性は <code>proxool.</code> をプレフィックスとする必要があり、これらの属性はProxoolコネクションプール自体の属性を設定するために使用されます。</li><li><code>jdbc</code> をプレフィックスとしない属性は無視され、Proxoolでは使用されません。</li><li><code>proxool.</code> をプレフィックスとしない属性は実際のデータベース接続に渡されます。つまり、これらの属性は実際のデータベースドライバに渡されます。</li></ol> Proxoolコネクションプールの詳細な設定方法については、<a href="https://proxool.sourceforge.net/configure.html">Configuration</a>をご参照ください。</p>
</main>
本ドキュメントの db.properties ファイルは、jdbc-1 という名前のデータソースのコネクションプール属性を設定するためのプロパティファイルの例です。主に以下の部分で構成されています:
データソースのエイリアスを
TESTに設定します。コードは以下の通りです:
jdbc-1.proxool.alias=TESTデータベース接続パラメータを設定します。
- ドライバのクラス名を設定します。ここではMySQL JDBCドライバのクラス名
com.mysql.jdbc.Driverです。 - ホストIP、ポート番号、アクセスするデータベース、および追加の接続属性を含む、データベース接続のURLを設定します。
- データベースのユーザー名を設定します。
- データベースのパスワードを設定します。
コードは以下の通りです:
jdbc-1.proxool.driver-class=com.mysql.jdbc.Driver jdbc-1.proxool.driver-url=jdbc:mysql://$host:$port/$database_name?useSSL=false jdbc-1.user=$user_name jdbc-1.password=$passwordパラメータの説明:
$host:接続文字列の-hパラメータから取得した、OceanBase Cloudの接続アドレスです。$port:接続文字列の-Pパラメータから取得した、OceanBase Cloudの接続ポートです。$database_name:接続文字列の-Dパラメータから取得した、アクセスするデータベース名です。$user_name:接続文字列の-uパラメータから取得した、アカウント名です。$password:接続文字列の-pパラメータから取得した、アカウントのパスワードです。
- ドライバのクラス名を設定します。ここではMySQL 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 | ホストIP、ポート番号、アクセスするスキーマ、およびオプションのデータベースドライバパラメータを含む、データベース接続URLを設定するために使用します。 |
| 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 機能を使用するには、接続テストに使用するSQL文を定義するための house-keeping-test-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は FatalSQLException と FatalRuntimeException の2つのクラスを提供しています。これらのクラスを使用するには、必要に応じてこの属性を 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という名前のパブリッククラスを定義します。
データベース設定(プロパティ)ファイルのパスを表す、
DB_PROPERTIES_FILEという名前のプライベート静的定数を定義します。この定数は、プロパティファイルを読み込んでロードするためにコード内で参照できます。プログラムの実行開始点として、パブリック静的メソッド
mainを定義します。発生する可能性のある例外をキャッチするためのコードブロックです。
- 設定ファイル内の属性を読み込むための
Propertiesオブジェクトを作成します。 - Mainクラスのクラスローダーを使用して、設定ファイルの入力ストリームを取得します。
- ロードされた入力ストリームを使用して設定ファイルをロードし、属性を
Propertiesオブジェクトにロードします。 - ロードされた属性を使用してコネクションプールを設定します。
- Proxoolデータベースドライバを動的にロードします。
- Proxoolドライバを使用してデータベース接続を確立します。
Statementオブジェクトを作成します。- 定義されたメソッド
executeDDLStatements()を呼び出してDDL文を実行します。これはテーブルを作成する操作です。 - 定義されたメソッド
executeDMLStatements()を呼び出してDML文を実行します。これはデータを挿入、更新、削除する操作です。 - 定義されたメソッド
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文を実行するメソッドを定義 // データを照会するメソッドを定義 }テーブルを作成するためのメソッドを定義します。
DDL(データ定義言語)文(テーブル作成文を含む)を実行するためのプライベート静的メソッド
executeDDLStatements()を定義します。具体的な手順は以下の通りです:Statementオブジェクトをパラメータとして受け取り、Exception例外をスローする可能性のあるプライベート静的メソッドexecuteDDLStatements()を定義します。execute()メソッドを使用してSQL文を実行し、test_proxoolという名前のテーブルを作成します。このテーブルにはc1とc2の2つの列があり、それぞれINT型とVARCHAR(32)型です。
コードは以下の通りです:
private static void executeDDLStatements(Statement stmt) throws Exception { stmt.execute("CREATE TABLE test_proxool (c1 INT, c2 VARCHAR(32))"); }DML文を実行するためのメソッドを定義します。
DML(データ操作言語)文(データの挿入、削除、更新の文を含む)を実行するためのプライベート静的メソッド
executeDMLStatements()を定義します。具体的な手順は以下の通りです:Statementオブジェクトをパラメータとして受け取るプライベート静的メソッドexecuteDMLStatements()を定義します。実行中に例外が発生した場合、このメソッドは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"); }データをクエリするためのメソッドを定義します。
SELECTクエリ文を実行して結果を処理するためのプライベート静的メソッドexecuteQueryStatements()を定義します。具体的な手順は以下の通りです:Statementオブジェクトをパラメータとして受け取るプライベート静的メソッドexecuteQueryStatements()を定義します。実行中に例外が発生した場合、このメソッドは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")); } } }
完全なコードの表示
```java
<?xml version="1.0" encoding="UTF-8"?>
<groupId>com.oceanbase</groupId>
<artifactId>proxool-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.47</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>
#alias: the alias of the data source
jdbc-1.proxool.alias=TEST
#driver-class: driver name
jdbc-1.proxool.driver-class=com.mysql.jdbc.Driver
#driver-url: url connection string, username and password must be determined
jdbc-1.proxool.driver-url=jdbc:mysql://$host:$port/$database_name?useSSL=false
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
```java
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 INT, c2 VARCHAR(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"));
}
}
}
} ```
関連情報
- MySQL Connector/Jの詳細については、MySQL Connector/Jの概要をご参照ください。
- Proxoolコネクションプールの使用に関する詳細については、ユーザー向け紹介をご参照ください。