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

表示された Open File or Project ウィンドウで、対応するプロジェクトファイルを選択し、OK をクリックしてプロジェクトファイルのインポートを完了します。
IntelliJ IDEAは、プロジェクト内のさまざまなファイルの種類を自動的に認識し、Project ツールウィンドウで、プロジェクトのディレクトリ構造、ファイルリスト、モジュールリスト、依存関係などの情報を確認できます。Project ツールウィンドウは通常、IntelliJ IDEA画面の左側にあり、デフォルトでは開いています。Project ツールウィンドウが閉じている場合は、メニューバーの View > Tool Windows > Project をクリックするか、ショートカットキー Alt + 1 を使用して再表示できます。
説明
IntelliJ IDEAでプロジェクトをインポートすると、IntelliJ IDEAはプロジェクト内のpom.xmlファイルを自動的に検出し、ファイルに記述された依存関係に基づいて必要な依存ライブラリを自動的にダウンロードし、それらをプロジェクトに追加します。
プロジェクトの状況を確認します。

ステップ2:OceanBaseデータベース接続情報を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -hxx.xx.xx.xx -P2883 -uroot@sys#cluster -p**** -Aデプロイ済みのOceanBaseデータベースに基づいて、以下のURLの対応する情報を入力します。
説明
application.propertiesファイルには、このURL情報が必要です。jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$password&characterEncoding=UTF-8パラメータ説明:
host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。schema_name:アクセスするスキーマ名です。user_name:テナントの接続アカウント。ODP接続方式では、ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名の2種類の一般的な形式があります。直接接続方式の形式はユーザー名@テナント名です。password:アカウントのパスワード。characterEncoding:データベースURLオプションでサポートされている文字エンコーディング。デフォルト値:utf8。
その他のURLパラメータの説明については、データベースURLを参照してください。
ステップ3:tomcat-mysql-client プロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベース接続情報を取得する の情報に基づいて、application.properties ファイル内のデータベース接続情報を修正します。
例:
- データベースドライバーの名前:
com.oceanbase.jdbc.Driver - OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
TESTです。 - テナントの接続アカウントは
root@xymysqlです。xymysqlはOceanBaseデータベースで作成されたMySQLモードのユーザーテナントであり、rootはテナントxymysqlのユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
#Apache Commons DBCP2 Connection Pool
#Database Connection Pool Driver Class Name
db.app.pool.driverClassName=com.oceanbase.jdbc.Driver
#Database URL
db.app.pool.url=jdbc:oceanbase://10.10.10.1/TEST?characterEncoding=UTF-8
#Database username
db.app.pool.username=root@xymysqll
#Database password
db.app.pool.password=******
#Initial size of connection pool
db.app.pool.initialSize=3
#Maximum number of connections in the connection pool
db.app.pool.maxTotal=10
#Maximum number of idle connections in the connection pool
db.app.pool.maxIdle=20
#Minimum number of idle connections in the connection pool
db.app.pool.minIdle=5
#Maximum wait time for obtaining connections (in milliseconds)
db.app.pool.maxWaitMillis=5000
#Verify the connection's query statement
db.app.pool.validationQuery=select 1 from dual
ステップ4:tomcat-mysql-client プロジェクトのTomcat実行環境を構築する
Tomcat 8.5.95をダウンロードします。
Apache Tomcat公式サイトからTomcat 8.5.95の圧縮ファイルをダウンロードします。ダウンロードしたファイルを、Tomcatをインストールしたいディレクトリに解凍します。
IDEAでTomcatを設定します。
IntelliJ IDEAを開き、FileメニューからSettings > Pluginsを選択します。Settingsウィンドウ中央の検索ボックスでSmart Tomcatを検索し、ダウンロード後にApplyを選択します。すると、Settingsウィンドウ左下にTomcat Serverタブが表示されます。Tomcat Serverタブに移動し、右側の**+ボタンをクリックして解凍したTomcatディレクトリを選択し、Apply→OK**の順にクリックして設定を完了します。

Tomcatの実行設定を作成します。
IDEAの上部ツールバーで、Run > Edit Configurationsを選択します。Run/Debug Configurationsウィンドウで、+ボタンをクリックし、Tomcat Serverを選択します。実行サーバー名Nameを入力し、Configuration選択ボックスでインストールしたバージョンのTomcat severを選択します。Context pathの値を
/に変更し、SSL portの値に8080を入力します。Before launch選択ボックスで、+をクリックし、Launch Web Browserを選択します。EditをクリックしてURLにhttp://localhost:8080/hello/getDataを入力します。Apply→OKの順にクリックして設定を完了します。
Tomcatサーバーを起動します。
IDEAの上部ツールバーで、先ほど作成したTomcatの実行設定を選択します。緑色の三角形の実行ボタンをクリックしてTomcatサーバーを起動します。IDEAのRunウィンドウでTomcatサーバーの起動ログを確認できます。
ステップ5:tomcat-mysql-client プロジェクトを実行する
実行パス。
IDEAの上部ツールバーで、先ほど作成したTomcatの実行構成を選択します。緑色の三角形の実行ボタンをクリックしてTomcatサーバーを起動します。Google ChromeまたはIEブラウザでパス
http://localhost:8080/hello/getDataを開き、実行結果を確認します。実行結果。
IDEAのコンソールウィンドウで、プロジェクトのログ情報と出力結果を確認します。
データ挿入後の結果。
tomcat 接続プールテスト0 tomcat 接続プールテスト1 tomcat 接続プールテスト2 tomcat 接続プールテスト3 tomcat 接続プールテスト4 tomcat 接続プールテスト5 tomcat 接続プールテスト6 tomcat 接続プールテスト7 tomcat 接続プールテスト8 tomcat 接続プールテスト9データ変更後の結果。
-----変更後----- POOl 接続プールテスト0 POOl 接続プールテスト1 POOl 接続プールテスト2 POOl 接続プールテスト3 POOl 接続プールテスト4 POOl 接続プールテスト5 POOl 接続プールテスト6 POOl 接続プールテスト7 POOl 接続プールテスト8 POOl 接続プールテスト9Webインターフェースに返す結果。

プロジェクトコードについて
tomcat-mysql-client をクリックしてプロジェクトコードをダウンロードします。これは tomcat-mysql-client という名前の圧縮ファイルです。
解凍すると、tomcat-mysql-client という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
│--pom.xml
│
├─.idea
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ └─testtomcat
│ │ │ ├─config
│ │ │ │ └─UserConfig.java
│ │ │ │
│ │ │ ├─controller
│ │ │ │ └─UserController.java
│ │ │ │
│ │ │ └─pojo
│ │ │ └─User.java
│ │ │
│ │ ├─resources
│ │ │ └─application.properties
│ │ │
│ │ └─webapp
│ │ └─WEB-INF
│ │ └─web.xml
│ │
│ │
│ │
│ └─test
│ └─java
│
│
└─target
ファイルの説明:
pom.xml:Mavenプロジェクトの設定ファイルで、プロジェクトの依存関係、プラグイン、ビルドなどの情報が含まれます。.idea:IDE(統合開発環境)で使用されるディレクトリで、プロジェクト関連の設定情報を格納します。src:プロジェクトのソースコードを格納するディレクトリです。main: 主要なソースコードとリソースファイルを格納するディレクトリ。java: Javaソースコードを格納するディレクトリ。com: Javaパッケージのルートディレクトリ。oceanbase: プロジェクトのルートディレクトリ。testtomcat:JFinalフレームワークに関連するコードを格納します。config:設定ファイルディレクトリで、アプリケーションの設定クラスファイルが含まれます。UserConfig.java:ユーザー設定クラスファイル。controller:コントローラーディレクトリで、アプリケーションのコントローラークラスファイルが含まれます。UserController.java:ユーザーコントローラークラスファイル。pojo: JavaBeanまたはエンティティクラスを格納します。User.java:ユーザーエンティティクラスを格納します。resources: リソースファイルを格納するディレクトリで、設定ファイルやSQLファイルなどが含まれます。application.properties: データベース接続情報を格納する設定ファイル。webapp:Webアプリケーションディレクトリで、Webアプリケーションの静的リソースと設定ファイルが含まれます。WEB-INF:WebアプリケーションのWEB-INFディレクトリで、設定ファイルやその他の保護されたリソースファイルを格納します。web.xml:Webアプリケーションのデプロイメント記述子ファイル。test: テストコードとリソースファイルを格納するディレクトリ。target: コンパイル済みのClassファイル、Jarパッケージなどのファイルを格納するディレクトリ。
pom.xmlコードの紹介
説明
例を確認するだけであれば、デフォルトのコードをそのまま使用し、変更は不要です。以下の説明に従って、ご自身の要件に合わせて pom.xml ファイルを変更することもできます。
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.oceanbaseと指定します。<artifactId>を使用して、プロジェクトの依存関係をtomcat-mysql-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。<packaging>を使用して、プロジェクトのパッケージング方式をWARファイル(Webアプリケーションアーカイブファイル)と指定します。
コード:
<groupId>com.oceanbase</groupId>
<artifactId>tomcat-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Packaging method (default to jar) -->
<packaging>war</packaging>
- Mavenバージョンの設定。
<maven.compiler.source> と <maven.compiler.target> を使用して、コンパイラのソースコードバージョンとターゲットコードバージョンをどちらもJava 8と指定します。
コード:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
コア依存関係の設定。
依存関係の所属組織を com.jfinal、名前を jfinal、バージョン番号を 5.0.6 と指定します。この依存関係により、JFinalフレームワークの機能を利用できます。
コード:
<dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>5.0.6</version> </dependency>依存関係の所属組織を
com.alibaba、名前をdruid、バージョン番号を1.2.8と指定します。この依存関係により、Druidライブラリを利用できます。Druidライブラリは、データベース接続の取得と解放の管理・最適化に使用されます。
**コード:**
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
```
- 依存関係の所属組織を
org.apache.commons、名前をcommons-dbcp2、バージョン番号を2.9.0と指定します。この依存関係により、Apache Commons DBCP2ライブラリを利用できます。Apache Commons DBCP2ライブラリは、データベース接続の取得と解放の管理・最適化に使用されます。
**コード:**
```xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
```
- 依存関係の所属組織を
mysql、名前をmysql-connector-java、バージョン番号を5.1.40と指定します。この依存関係により、OceanBaseが提供するクライアント機能(接続、クエリ、トランザクションなど)を利用できます。
**コード:**
```xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
```
application.propertiesファイルの紹介
application.properties ファイルは、OceanBaseデータベースへの接続情報を設定します。データベースドライバーのクラス名、接続URL、ユーザー名、パスワード、および接続プールに関する設定が含まれます。これらのパラメータは、アプリケーション内でデータベース接続を取得および管理し、データベース操作を実行するために使用されます。
db.app.pool.driverClassNameを使用して、データベースドライバーをcom.mysql.jdbc.Driverと指定し、OceanBaseデータベースとの接続を確立します。db.app.pool.urlを使用して、データベース接続用のURLを指定します。db.app.pool.usernameを使用して、データベース接続用のユーザー名を指定します。db.app.pool.passwordを使用して、データベース接続用のパスワードを指定します。db.app.pool.initialSizeを使用して、接続プールの初期サイズを3に指定します。初期状態で3つのデータベース接続が作成されます。db.app.pool.maxTotalを使用して、接続プールの最大サイズを10に指定します。接続プール内で最大10個のデータベース接続を作成できます。db.app.pool.maxIdleを使用して、接続プールのアイドル接続数の上限を20に指定します。db.app.pool.minIdleを使用して、接続プールのアイドル接続数の下限を5に指定します。db.app.pool.maxWaitMillisを使用して、データベース接続のタイムアウト時間を5000msに指定します。データベース接続を取得する際、5000msを超えても接続を取得できない場合、タイムアウト例外がスローされます。db.app.pool.validationQueryを使用して、データベース接続の有効性を検証するために使用するSQLクエリステートメントをselect 1と指定します。接続プールから接続を取得する際、このクエリステートメントが実行され、接続の有効性が検証されます。コード:
#Apache Commons DBCP2 Connection Pool #Database Connection Pool Driver Class Name db.app.pool.driverClassName=com.mysql.jdbc.Driver #Database URL db.app.pool.url=jdbc:mysql:////host:port/schema_name?characterEncoding=UTF-8 #Database username db.app.pool.username=user_name #Database password db.app.pool.password=****** #Initial size of connection pool db.app.pool.initialSize=3 #Maximum number of connections in the connection pool db.app.pool.maxTotal=10 #Maximum number of idle connections in the connection pool db.app.pool.maxIdle=20 #Minimum number of idle connections in the connection pool db.app.pool.minIdle=5 #Maximum wait time for obtaining connections (in milliseconds) db.app.pool.maxWaitMillis=5000 #Verify the connection's query statement db.app.pool.validationQuery=select 1
Tomcat組み込み接続プールDBCPの一般的なパラメータ:
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整および設定を行うことを推奨します。
プロパティ |
デフォルト値 |
説明 |
|---|---|---|
| username | N/A | データベース接続用のユーザー名を指定するために使用されます。 |
| password | N/A | データベース接続用のパスワードを指定するために使用されます。 |
| url | N/A | データベースの接続URLを指定するために使用されます。 |
| driverClassName | N/A | データベースドライバーの標準Javaクラス名を指定するために使用されます。 |
| connectionProperties | N/A | 新しい接続を確立する際にJDBCドライバーに送信する接続プロパティを指定するために使用されます。形式は[propertyName=property;]です。 |
| defaultAutoCommit | driver default | 接続プールが接続を作成する際のデフォルトの自動コミット状態を指定するために使用されます。設定しない場合、setAutoCommitメソッドは呼び出されません。 |
| defaultReadOnly | driver default | 接続プールが接続を作成する際のデフォルトの読み取り専用状態を指定するために使用されます。設定しない場合、setReadOnlyメソッドは呼び出されません。 |
| defaultTransactionIsolation | driver default | 接続プールが接続を作成する際のデフォルトのトランザクション分離レベルを指定するために使用されます。 |
| defaultCatalog | N/A | 接続プールが作成するデフォルトの接続カタログを指定するために使用されます。 |
| cacheState | true | 接続のreadOnlyおよびautoCommit設定をキャッシュするかどうかを指定するために使用されます。Trueの場合、最初の読み取りまたは書き込み、およびその後のすべての書き込み時に現在のreadOnlyおよびautoCommit設定がキャッシュされます。これにより、getterへの以降の呼び出しにおける追加のデータベースクエリが不要になります。 |
| defaultQueryTimeout | null | 接続プール内の接続作成ステートメントのクエリタイムアウト時間を設定するために使用されます。非NULLの場合、このIntegerプロパティの値がプールから接続を管理するための接続作成ステートメントのクエリタイムアウトに使用されます。NULLの場合、ドライバーのデフォルト値が使用されます。 |
| enableAutoCommitOnReturn | true | 接続がプールに戻る際に、自動コミットが有効かどうかをチェックして設定するかどうかを指定するために使用されます。 |
| rollbackOnReturn | true | 接続がプールに戻る際に、自動コミットが無効で読み取り専用ではない接続をロールバックするかどうかを指定するために使用されます。Trueの場合、自動コミットが無効で接続が読み取り専用でない場合、接続はプールに戻る際にロールバックされます。 |
| initialSize | 0 | 接続プール起動時に作成する初期接続数を設定するために使用されます。 |
| maxTotal | 8 | 接続プールから割り当てる最大アクティブ接続数を設定するために使用されます。 |
| maxIdle | 8 | 接続プール内でアイドル状態を維持する最大接続数を設定します。追加の接続数は解放されません。負の数値を設定すると制限がないことを意味します。 |
| minIdle | 0 | 接続プール内でアイドル状態を維持する最小接続数を設定します。追加の接続は作成されません。値が0の場合、作成しないことを意味します。 |
| maxWaitMillis | indefinitely | 例外がスローされるまでに、プールが(利用可能な接続がない場合)接続の返却を待機する最大ミリ秒数を設定します。値が-1の場合、無期限待機を意味します。 |
| validationQuery | N/A | 接続検証用のSQLクエリステートメントを指定するために使用されます。この値を指定する場合、必ず少なくとも1行のSQL SELECTステートメントを返す必要があります。この値を指定しない場合、接続はisValidメソッドを呼び出して検証されます。 |
| validationQueryTimeout | no timeout | 接続検証クエリが失敗するまでのタイムアウト時間を設定します。単位は秒です。正の値を設定すると、その値は検証クエリを実行するために使用されるsetQueryTimeoutメソッドを通じてドライバーStatementに渡されます。 |
| testOnCreate | false | 接続作成後にオブジェクトを検証するかどうかを指定するために使用されます。オブジェクトが検証できない場合、オブジェクト作成の借用試行は失敗します。 |
| testOnBorrow | true | 接続プールからオブジェクトを借用する前に検証するかどうかを示す指示を指定するために使用されます。オブジェクトが検証できない場合、そのオブジェクトは接続プールから削除され、別のオブジェクトの借用が試みられます。 |
| testOnReturn | false | オブジェクトがプールに戻される前に検証されるかどうかを指定するためのフラグです。 |
| testWhileIdle | false | アイドルオブジェクトエビクター(該当する場合)によってオブジェクトが検証されるかどうかを指定するためのフラグです。オブジェクトが検証に失敗した場合、接続プールから削除されます。 |
| timeBetweenEvictionRunsMillis | -1 | アイドルオブジェクトエビクションスレッドの実行間待機時間をミリ秒単位で設定します。値が正の数以外の場合、アイドルオブジェクトエビクションスレッドは実行されません。 |
| numTestsPerEvictionRun | 3 | アイドルオブジェクトエビクションスレッドの各実行でチェックするオブジェクト数を設定します。 |
| minEvictableIdleTimeMillis | 1000 * 60 * 30 | オブジェクトが接続プール内でアイドル状態となる最小時間を設定します。 |
| softMinEvictableIdleTimeMillis | -1 | 接続がプール内でアイドル状態となる最小時間を設定します。MinIdle制約を含みます。 |
| maxConnLifetimeMillis | -1 | 接続の最大ライフタイムをミリ秒単位で設定します。この時間を超えると、接続は次回のアクティベーション、ダウン、または検証テストを行うことができません。値が0またはそれ以下の場合、接続は無限のライフタイムを持つことを意味します。 |
| logExpiredConnections | true | 最大ライフタイムを超えてプールによって閉じられた接続を記録するかどうかを指定するためのフラグです。値がFalseの場合、有効な期限切れ接続のログ記録を禁止します。 |
| connectionInitSqls | null | 初回の物理接続作成時に初期化するSQLステートメントの集合を指定するためのプロパティです。これらのステートメントは、設定された接続ファクトリが接続を作成する際にのみ実行されます。 |
| lifo | true | borrowObjectメソッドがプール内で最後に使用された接続を返すかどうかを指定するためのフラグです。値がTrueの場合、borrowObjectはプール内で最後に使用されたlast in接続を返します(空いている接続が利用可能な場合)。値がFalseの場合、接続はプールに返却された順序でアイドルインスタンスプールから取得されます(FIFOキュー)。 |
| poolPreparedStatements | false | 準備済みステートメントプールを有効にするかどうかを指定するためのフラグです。 |
| maxOpenPreparedStatements | unlimited | 接続プールから割り当てる最大開放ステートメント数を設定します。値が負の数の場合、無制限を意味します。 |
| accessToUnderlyingConnectionAllowed | false | アンダーレイヤー接続へのアクセスを許可するかどうかを指定するためのフラグです。 |
| removeAbandonedOnMaintenance | false | 接続プールのメンテナンスサイクル中に廃棄された接続を削除するかどうかを指定するためのフラグです。値がTrueの場合、メンテナンスサイクル(エビクション終了時)に廃棄された接続が削除されます。このプロパティは、timeBetweenEvictionRunsMillisを正の値に設定してメンテナンスを有効にしない限り、無効です。 |
| removeAbandonedOnBorrow | false | 接続プールから接続を借用する際に廃棄された接続を削除するかどうかを指定するためのフラグです。値がTrueの場合、プールから接続を借用するたびに廃棄された接続が削除されます。この場合、以下の追加要件が適用されます:
|
| removeAbandonedTimeout | 300 | 廃棄された接続を削除するまでのタイムアウト時間を秒単位で設定します。このパラメータを設定することで、接続が廃棄され、削除可能と見なされるまでの最大アイドル時間を指定できます。 |
| logAbandoned | false | 廃棄された接続のアプリケーションコードのスタックトレースを記録するかどうかを指定するためのフラグです。スタックトレースを生成する必要があるため、放棄されたステートメントや接続の記録は、接続の開始や新しいステートメントの開始時のオーバーヘッドを増加させます。 |
| abandonedUsageTracking | false | 廃棄された接続のスタックトレースを記録するかどうかを指定します。Trueの場合、プール接続でメソッドが呼び出されるたびに、接続プールはスタックトレースを記録し、最新のスタックトレースを保持して廃棄された接続のデバッグを支援します。ただし、Trueに設定するとオーバーヘッドが大幅に増加します。 |
| fastFailValidation | false | 致命的なSQLExceptionをスローした接続に対して、クイック失敗を検証するかどうかを指定します。Trueの場合、接続切断のリクエストは即座に失敗し、ドライバーのisValidメソッドを呼び出したり、検証クエリの実行を試みたりしません。致命的なエラーシグナルと見なされるSQL_STATEコードは、デフォルトで以下のとおりです:
|
| disconnectionSqlCodes | null | カンマ区切りのSQL_STATEコードリストを指定します。これらのコードは、致命的な接続切断エラーを示すシグナルと見なされます。fastFailValidationパラメータをTrueに設定した場合にのみ、disconnectionSqlCodesプロパティの設定が有効になります。 |
| jmxName | N/A | 操作および監視可能なデータソースオブジェクトを指定し、データソースを指定された名前のJMX MBeanとして登録します。この名前はJMXオブジェクト名構文に準拠している必要があります(javadocを参照)。 |
web.xmlコードの紹介
web.xml ファイルは、Webアプリケーションのフィルターを設定するために使用されます。
web.xml 設定ファイルの内容は以下のとおりです:
ファイル宣言ステートメント。
このファイルがXMLファイルであり、使用しているXMLバージョンが
1.0、文字エンコーディング方式がUTF-8であることを宣言します。コード:
<?xml version="1.0" encoding="UTF-8"?>XMLの名前空間とXMLモデルバージョンの設定。
xmlns:xsiを使用して、XML名前空間をhttp://www.w3.org/2001/XMLSchema-instanceと指定します。xmlnsを使用して、XMLの名前空間をhttp://java.sun.com/xml/ns/javaeeと指定します。xsi:schemaLocationを使用して、XMLの名前空間をhttp://java.sun.com/xml/ns/javaeeと指定し、XMLのXSDファイルの場所をhttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsdと指定します。<id>と<version>要素を使用して、WebアプリケーションのIDをWebApp_ID、バージョン番号を3.0と指定します。
コード:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"
version="3.0">
JFinalフィルターの設定。
WebアプリケーションでJFinalフレームワークを使用するために、
jfinalという名前のフィルターを設定します。フィルターのクラスをcom.jfinal.core.JFinalFilterと指定します。初期化パラメータconfigClassを指定することで、JFinalフレームワークの設定クラスの場所をcom.oceanbase.testtomcat.config.UserConfigと指定します。JFinalフィルターは、WebアプリケーションでJFinalフレームワークを使用し、指定された設定クラスに基づいてJFinalフレームワークの動作を設定するために使用されます。
コード:
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!-- your jfinal configuration location -->
<param-value>com.oceanbase.testtomcat.config.UserConfig</param-value>
</init-param>
</filter>
JFinalフィルターマッピングの設定。
jfinalフィルターをすべてのリクエストパスに適用します。つまり、このフィルターはアプリケーション内のすべてのリクエストに適用されます。
コード:
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
UserConfig.javaファイルの紹介
UserConfig.java ファイルは、アプリケーションのルーティング、プラグイン、データベース接続などの関連情報を設定するために使用されます。
UserConfig.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。
このファイルには以下のインターフェースとクラスが含まれていることを宣言します:
StatFilterクラス:データベースアクセスのパフォーマンス統計に使用されます。JdbcConstantsクラス:データベースタイプの定数を定義するために使用されます。WallFilterクラス:SQLインジェクション攻撃を防ぐために使用されます。PropKitクラス:設定ファイルを読み取るために使用されます。ActiveRecordPluginクラス:データベース操作に使用されます。Dbクラス:データベース操作を実行するために使用されます。MysqlDialectクラス:データベースの方言を指定するために使用されます。DruidPluginクラス:データベース接続に使用されます。Engineクラス:テンプレートエンジンの設定に使用されます。UserControllerクラス:ユーザー関連のリクエストを処理するために使用されます。Userクラス:ユーザーデータの受け渡しと保存に使用されます。
コード:
import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.wall.WallFilter; import com.jfinal.config.*; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.dialect.MysqlDialect; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.template.Engine; import com.oceanbase.testjfinal.controller.UserController; import com.oceanbase.testjfinal.pojo.User;UserConfigクラスの定義。JFinalConfigクラスの各メソッドをオーバーライドすることで、定数、ルーティング、プラグイン、データベース接続などの情報を設定できます。configConstantメソッドの定義。JFinalフレームワークの定数を設定するために使用され、
PropKitを使用して設定ファイルから設定を読み取ります。コード:
@Override public void configConstant(Constants constants) { PropKit.use("application.properties"); }configRouteメソッドの定義。ルーティングマッピングを設定するために使用され、
routes.addメソッドを使用して"/hello"パスをUserControllerクラスのデフォルトアクセスページにマッピングします。コード:
@Override public void configRoute(Routes routes) { routes.add("/hello", UserController.class, "/"); }configEngineメソッドの定義。テンプレートエンジンを設定するために使用されます。
コード:
@Override public void configEngine(Engine engine) { }configPluginメソッドの定義。アプリケーションのプラグインを設定するために使用されます。
initメソッドを呼び出してデータベース接続とテーブル構造を初期化し、DruidPluginとActiveRecordPluginプラグインを作成してpluginsに追加します。同時に、activeRecordPluginのaddMappingメソッドを呼び出してデータベーステーブルとエンティティクラスのマッピング関係を追加し、TEST_USERテーブルをUserクラスにマッピングします。コード:
@Override public void configPlugin(Plugins plugins) { init(); DruidPlugin druidPlugin = createDruidPlugin(); plugins.add(druidPlugin); ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin); activeRecordPlugin.addMapping("TOMCAT_TEST", User.class); plugins.add(activeRecordPlugin); }createDruidPluginメソッドの定義。DruidPluginプラグインを作成し、接続プールサイズ、SQLファイアウォール、接続エラー処理などの関連パラメータを設定するために使用されます。PropKitのgetメソッドを呼び出して、設定ファイルからURL、ユーザー名、パスワード、ドライバークラスなどのデータベース接続関連のプロパティ値を取得します。次に、DruidPluginオブジェクトを作成し、取得したプロパティ値で初期化します。addFilterメソッドを呼び出して、DruidPluginにStatFilterインスタンスを追加し、データベースアクセスのパフォーマンス統計に使用します。WallFilterインスタンスを作成し、setDbTypeメソッドでデータベースタイプをOceanBaseに設定してDruidPluginに追加し、SQLファイアウォールフィルタリングを実行します。setInitialSizeメソッドを呼び出して接続プールの初期サイズを設定します。setMaxPoolPreparedStatementPerConnectionSizeメソッドで接続プールごとのプリペアドステートメントの最大数を設定します。setTimeBetweenConnectErrorMillisメソッドで接続エラー間の時間間隔を設定します。setValidationQueryメソッドで接続の検証クエリステートメントを設定します。最後に、作成したDruidPluginインスタンスを返します。コード:
private DruidPlugin createDruidPlugin() { DruidPlugin druidPlugin = new DruidPlugin( PropKit.get("db.app.pool.url"), PropKit.get("db.app.pool.username"), PropKit.get("db.app.pool.password"), PropKit.get("db.app.pool.driverClassName") ); druidPlugin.addFilter(new StatFilter()); WallFilter wallFilter = new WallFilter(); wallFilter.setDbType(JdbcConstants.OCEANBASE); druidPlugin.addFilter(wallFilter); druidPlugin.setInitialSize(PropKit.getInt("db.app.pool.initialSize")); druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(PropKit.getInt("db.app.pool.maxTotal")); druidPlugin.setTimeBetweenConnectErrorMillis(PropKit.getInt("db.app.pool.maxWaitMillis")); druidPlugin.setValidationQuery("select 1"); return druidPlugin; }
initメソッドの定義。データベース接続の初期化とデータベーステーブルの作成に使用されます。
initDbConnectionメソッドを呼び出してデータベース接続を初期化し、ActiveRecordPluginインスタンスを返します。次に、SQLステートメントを実行してユーザーテーブルTOMCAT_TESTが存在するかどうかを確認します。テーブルTOMCAT_TESTが存在する場合、SQLステートメントDROP TABLE TOMCAT_TESTを実行してそのテーブルを削除します。その後、CREATE TABLEステートメントを実行してTOMCAT_TESTという名前のデータベーステーブルを作成します。このテーブルにはIDとUSERNAMEの2つのフィールドが含まれます。最後に、ActiveRecordPluginプラグインの接続を閉じてデータベース接続を解放します。コード:
public void init() { ActiveRecordPlugin arp = initDbConnection(); // Check if table exists boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'TEST' AND TABLE_NAME = 'TOMCAT_TEST'") > 0; // Drop table if it exists if (tableExists) { Db.update("DROP TABLE TOMCAT_TEST"); } // Create table String sql = "CREATE TABLE TOMCAT_TEST (ID int, USERNAME varchar(50))"; Db.update(sql); arp.stop(); }initDbConnectionメソッドの定義。データベース接続の初期化に使用されます。まず、
createDruidPluginメソッドを呼び出してDruidPluginオブジェクトを作成し、変数druidPluginに代入します。このメソッドは、データベース接続プールの管理に使用されるDruidPluginの作成と設定を担当します。次に、createActiveRecordPluginメソッドを呼び出してActiveRecordPluginオブジェクトを作成し、DruidPluginオブジェクトをパラメータとしてこのメソッドに渡します。このメソッドは、データベース操作の管理に使用されるActiveRecordPluginの作成と設定を担当します。その後、druidPlugin.startメソッドを呼び出してDruidPluginを起動し、データベース接続プールを初期化します。最後に、activeRecordPlugin.startメソッドを呼び出してActiveRecordPluginを起動します。このメソッドは、設定に基づいてデータベース操作に関する設定を初期化します。コード:
private ActiveRecordPlugin initDbConnection() { DruidPlugin druidPlugin = createDruidPlugin(); ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin); druidPlugin.start(); activeRecordPlugin.start(); return activeRecordPlugin; }ConfigInterceptorとConfigHandlerメソッドの定義。システム初期化プロセス中にグローバル設定を行うために使用されます。
コード:
@Override public void configInterceptor(Interceptors interceptors) { } @Override public void configHandler(Handlers handlers) { }
UserController.javaファイルの紹介
UserController.java ファイルは、getData メソッドを使用してデータベースにデータを挿入し、データをクエリして、その結果をJSON形式でクライアントに返します。JFinalフレームワークが提供する Db クラスを使用してデータベース操作を実行し、カスタムの User クラスを使用してデータマッピングを行うことで、データベース操作とデータ返却機能を実現しています。
UserController.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。
このファイルには以下のインターフェースとクラスが含まれていることを宣言します:
Controllerクラス:リクエストとレスポンスを処理するために使用されます。Dbクラス:データベース操作を実行するために使用されます。Recordクラス:データのクエリ、挿入、更新、削除などのデータベース操作を実行するために使用されます。ArrayListクラス:空のリストを作成するために使用されます。Userクラス:データベーステーブルをマッピングするために使用されます。Listインターフェース:クエリ結果の集合を操作するために使用されます。
コード:
import com.jfinal.core.Controller; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record; import java.util.ArrayList; import java.util.List;UserControllerクラスの定義。JFinalフレームワークにコントローラーを提供し、
getDataメソッドを使用してデータベースへのデータ挿入とデータクエリ操作を実行するために使用されます。データの挿入。10個の
Recordオブジェクトを含むリストdataListを作成します。各Recordオブジェクトは、異なるIDとUSERNAMEフィールド値を持ちます。次に、Db.batchSaveメソッドを使用して、dataListリスト内のレコードをTOMCAT_TESTという名前のデータベーステーブルに一括保存します。コード:
for (int i = 0; i < 10; i++) { Record record = new Record().set("ID", i).set("USERNAME", "tomcat 接続プールテスト" + i); dataList.add(record); } Db.batchSave("TOMCAT_TEST", dataList, dataList.size());データのクエリ。
Db.findメソッドを使用してSQLクエリを実行し、結果をresultListリストに格納します。拡張forループを使用して、resultListリスト内の各Recordオブジェクトを走査します。getStrメソッドを使用してRecordオブジェクトの指定フィールドの値を取得し、System.out.printlnメソッドを使用して出力します。コード:
List<Record> resultList = Db.find("SELECT * FROM TOMCAT_TEST"); for (Record result : resultList) { System.out.println(result.getStr("USERNAME")); }データの更新。ループを使用して10回繰り返し、各繰り返しで1つの更新ステートメントを実行します。更新ステートメントは
Db.updateメソッドを使用して実行され、TOMCAT_TESTという名前のデータベーステーブル内のレコードを条件に基づいて更新します。コード:
for (int i = 0; i < 10; i++) { Db.update("UPDATE TOMCAT_TEST SET USERNAME = 'POOl 接続プールテスト" + i + "' WHERE ID = " + i); }更新後のデータのクエリ。
TOMCAT_TESTという名前のデータベーステーブルをクエリし、結果をmodifiedListに保存します。-----更新後-----というメッセージを出力します。modifiedListを走査し、各レコードのUSERNAMEフィールド値を出力します。renderJsonメソッドを使用して応答メッセージData retrieved successfullyをJSON形式でレンダリングし、クライアントに返します。コード:
List<Record> modifiedList = Db.find("SELECT * FROM TOMCAT_TEST"); System.out.println("-----更新後-----"); for (Record modified : modifiedList) { System.out.println(modified.getStr("USERNAME")); } renderJson("Data retrieved successfully");
User.javaファイルの紹介
User.java ファイルは、データベーステーブルとJavaオブジェクトのマッピングを実装するために使用されます。
User.java ファイルのコードは、主に以下の部分で構成されています:
Modelクラスのインポート。Modelクラスは、データベーステーブルのマッピングとデータ操作に使用されます。Userクラスの定義。Userクラスは、継承したModelクラスが提供するメソッドを使用してデータベース操作を行います。コード:
import com.jfinal.plugin.activerecord.Model; public class User extends Model<User> { public static final User dao = new User(); }
全コード表示
<?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>tomcat-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Packaging method (default to jar) -->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>5.0.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
</dependencies>
</project>
#Apache Commons DBCP2 Connection Pool
#Database Connection Pool Driver Class Name
db.app.pool.driverClassName=com.mysql.jdbc.Driver
#Database URL
db.app.pool.url=jdbc:mysql:////host:port/schema_name?characterEncoding=UTF-8
#Database username
db.app.pool.username=user_name
#Database password
db.app.pool.password=******
#Initial size of connection pool
db.app.pool.initialSize=3
#Maximum number of connections in the connection pool
db.app.pool.maxTotal=10
#Maximum number of idle connections in the connection pool
db.app.pool.maxIdle=20
#Minimum number of idle connections in the connection pool
db.app.pool.minIdle=5
#Maximum wait time for obtaining connections (in milliseconds)
db.app.pool.maxWaitMillis=5000
#Verify the connection's query statement
db.app.pool.validationQuery=select 1
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!-- your jfinal configuration location -->
<param-value>com.oceanbase.testjfinal.config.UserConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
package com.oceanbase.testtomcat.config;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.config.*;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;
import com.oceanbase.testtomcat.controller.UserController;
import com.oceanbase.testtomcat.pojo.User;
public class UserConfig extends JFinalConfig {
@Override
public void configConstant(Constants constants) {
// Read properties configuration
PropKit.use("application.properties");
}
@Override
public void configRoute(Routes routes) {
// Set the default access page for project startup, which does not need to be set in the web.
routes.add("/hello", UserController.class);
}
@Override
public void configEngine(Engine engine) {
}
@Override
public void configPlugin(Plugins plugins) {
init();
DruidPlugin druidPlugin = createDruidPlugin();
plugins.add(druidPlugin);
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
activeRecordPlugin.addMapping("TOMCAT_TEST", User.class);
plugins.add(activeRecordPlugin);
}
private DruidPlugin createDruidPlugin() {
DruidPlugin druidPlugin = new DruidPlugin(
PropKit.get("db.app.pool.url"),
PropKit.get("db.app.pool.username"),
PropKit.get("db.app.pool.password"),
PropKit.get("db.app.pool.driverClassName")
);
druidPlugin.addFilter(new StatFilter());
WallFilter wallFilter = new WallFilter();
wallFilter.setDbType(JdbcConstants.OCEANBASE);
druidPlugin.addFilter(wallFilter);
druidPlugin.setInitialSize(PropKit.getInt("db.app.pool.initialSize"));
druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(PropKit.getInt("db.app.pool.maxTotal"));
druidPlugin.setTimeBetweenConnectErrorMillis(PropKit.getInt("db.app.pool.maxWaitMillis"));
druidPlugin.setValidationQuery("select 1 from dual");
return druidPlugin;
}
private ActiveRecordPlugin createActiveRecordPlugin(DruidPlugin druidPlugin) {
ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
activeRecordPlugin.setDialect(new MysqlDialect());
return activeRecordPlugin;
}
public void init() {
ActiveRecordPlugin arp = initDbConnection();
// Check if table exists
boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'TEST' AND TABLE_NAME = 'TOMCAT_TEST'") > 0;
// Drop table if it exists
if (tableExists) {
Db.update("DROP TABLE TOMCAT_TEST");
}
// Create table
String sql = "CREATE TABLE TOMCAT_TEST (ID int, USERNAME varchar(50))";
Db.update(sql);
arp.stop();
}
private ActiveRecordPlugin initDbConnection() {
DruidPlugin druidPlugin = createDruidPlugin();
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
druidPlugin.start();
activeRecordPlugin.start();
return activeRecordPlugin;
}
@Override
public void configInterceptor(Interceptors interceptors) {
}
@Override
public void configHandler(Handlers handlers) {
}
}
package com.oceanbase.testtomcat.controller;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import java.util.ArrayList;
import java.util.List;
public class UserController extends Controller {
public void getData() {
try {
List<Record> dataList = new ArrayList<>();
// データの挿入
for (int i = 0; i < 10; i++) {
Record record = new Record().set("ID", i).set("USERNAME", "Tomcat接続プールテスト" + i);
dataList.add(record);
}
Db.batchSave("TOMCAT_TEST", dataList, dataList.size());
// データのクエリ
List<Record> resultList = Db.find("SELECT * FROM TOMCAT_TEST");
for (Record result : resultList) {
System.out.println(result.getStr("USERNAME"));
}
// データの更新
for (int i = 0; i < 10; i++) {
Db.update("UPDATE TOMCAT_TEST SET USERNAME = 'Pool接続プールテスト" + i + "' WHERE ID = " + i);
}
// 更新後のデータのクエリ
List<Record> modifiedList = Db.find("SELECT * FROM TOMCAT_TEST");
System.out.println("-----更新後-----");
for (Record modified : modifiedList) {
System.out.println(modified.getStr("USERNAME"));
}
renderJson("Data retrieved successfully");
} catch (Exception e) {
e.printStackTrace();
renderJson("Error occurred");
}
}
}
package com.oceanbase.testtomcat.pojo;
import com.jfinal.plugin.activerecord.Model;
public class User extends Model<User> {
public static final User dao = new User();
}
関連ドキュメント
OceanBase Connector/Jの詳細については、OceanBase JDBCドライバを参照してください。
tomcat-mysql-client サンプルプロジェクトをダウンロード