本ドキュメントでは、Tomcat接続プール、OceanBase Connector/J、およびOceanBase データベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、削除、更新、クエリなどの基本的なデータベース操作を実装する方法について説明します。
前提条件
- OceanBase Cloudアカウントを登録し、クラスタインスタンスとOceanBase Cloud MySQLテナントを作成していること。詳細は、クラスタインスタンスの作成およびテナントの作成をご参照ください。
- 対象のMySQL互換モードテナントの接続文字列を取得していること。詳細な操作については、接続文字列の取得をご参照ください。
- JDK 1.8およびMavenをインストールしていること。
- IntelliJ IDEAをインストールしていること。
説明
本ドキュメントでコードを実行するために使用しているツールはIntelliJ IDEA 2021.3.2 (Community Edition) です。お好みに応じて、サンプルコードの実行に適したツールを選択することもできます。
操作手順
説明
本ドキュメントに記載されている手順は、Windows環境に基づいています。他のオペレーティングシステム環境やコンパイラを使用している場合、手順が若干異なる場合があります。
操作手順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:tomcat-mysql-client プロジェクトのデータベース接続情報を変更する
前提条件で取得した接続文字列情報に基づいて、application.properties ファイル内のデータベース接続情報を変更します。
例は以下の通りです:
- データベースドライバ名:
com.oceanbase.jdbc.Driver - 接続アドレス:
t5******.********.oceanbase.cloud - アクセスポート:3306
- アクセスするSchema名:
TEST - テナントの接続アカウント:
xymysql(xymysqlはOceanBase Cloudで作成されたデータベースアカウントです) - パスワード:
******
サンプルコードは以下の通りです:
#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://t5******.********.oceanbase.cloud/TEST?characterEncoding=UTF-8
#Database username
db.app.pool.username=xymysql
#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
操作手順3:tomcat-mysql-client プロジェクトのTomcat実行環境を構築する
- Tomcat 8.5.95 バージョンをダウンロードします。
Apache Tomcat公式Webサイトから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サーバーの起動ログを確認できます。
操作手順4: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 连接池测试9 ```
- Webインターフェースに返される結果。
プロジェクトコードの紹介
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
<?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フレームワークの機能を使用できます。
コードは以下の通りです:
```xml
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>5.0.6</version>
</dependency>
```
- 依存関係が属する組織を
com.alibaba、名前をdruid、バージョン番号を1.2.8に指定します。この依存関係により、データベース接続の取得と解放を管理および最適化するための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ライブラリを使用できます。
コードは以下の通りです:
```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
<?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` クラス:ユーザーデータを渡して保存するために使用されます。
コードは以下の通りです:
```java
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 を使用して設定ファイル内の設定を読み取ります。
コードは以下の通りです:
```java
@Override
public void configConstant(Constants constants) {
PropKit.use("application.properties");
}
```
configRouteメソッドの定義。
ルーティングマッピングを設定するために使用され、routes.add メソッドを使用して "/hello" パスを UserController クラスのデフォルトアクセスベージにマッピングします。
コードは以下の通りです:
```java
@Override
public void configRoute(Routes routes) {
routes.add("/hello", UserController.class, "/");
}
```
configEngineメソッドの定義。
テンプレートエンジンを設定するために使用されます。
コードは以下の通りです:
```java
@Override
public void configEngine(Engine engine) {
}
```
configPluginメソッドの定義。
アプリケーションのプラグインを設定するために使用されます。init メソッドを呼び出してデータベース接続とテーブル構造を初期化し、DruidPlugin および ActiveRecordPlugin プラグインを作成して plugins に追加します。同時に、activeRecordPlugin の addMapping メソッドを呼び出して、データベーステーブルとエンティティクラスのマッピング関係を追加し、TEST_USER テーブルを User クラスにマッピングします。
コードは以下の通りです:
```java
@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メソッドを呼び出して、データベースアクセスのパフォーマンスを統計するためのStatFilterインスタンスをDruidPluginに追加します。WallFilterインスタンスを作成し、setDbTypeメソッドを使用してデータベースタイプをOceanBaseに設定し、SQLファイアウォールフィルタリングを行うためにDruidPluginに追加します。 *setInitialSizeメソッドを呼び出して接続プールの初期サイズを設定し、setMaxPoolPreparedStatementPerConnectionSizeメソッドで各接続プールの最大プリペアドステートメント数を設定し、setTimeBetweenConnectErrorMillisメソッドで2回の接続エラー間の時間間隔を設定し、setValidationQueryメソッドで接続の検証クエリ文を設定します。最後に、作成したDruidPluginインスタンスを返します。
コードは以下の通りです:
```java
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 プラグインの接続を閉じ、データベース接続を解放します。
コードは以下の通りです:
```java
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 を起動します。このメソッドは、設定に基づいてデータベース操作の関連設定を初期化します。
コードは以下の通りです:
```java
private ActiveRecordPlugin initDbConnection() {
DruidPlugin druidPlugin = createDruidPlugin();
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
druidPlugin.start();
activeRecordPlugin.start();
return activeRecordPlugin;
}
```
ConfigInterceptorおよびConfigHandlerメソッドの定義。
システムの初期化プロセス中にグローバル設定を行うために使用されます。
コードは以下の通りです:
```java
@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` インターフェース:クエリ結果セットを操作するために使用されます。
コードは以下の通りです:
```java
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という名前のデータベーステーブルに一括保存します。
コードは以下の通りです:
```java
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メソッドを使用して出力します。
コードは以下の通りです:
```java
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という名前のデータベーステーブル内のレコードを更新します。
コードは以下の通りです:
```java
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形式でレンダリングし、クライアントに返します。
コードは以下の通りです:
```java
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 クラスが提供するメソッドを通じてデータベース操作を実行します。
コードは以下の通りです:
```java
import com.jfinal.plugin.activerecord.Model;
public class User extends Model<User> {
public static final User dao = new User();
}
```
完全なコードの表示
```xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
#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
<?xml version="1.0" encoding="UTF-8"?>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
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ドライバをご参照ください。