本記事では、Tomcat接続プール、OceanBase Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブル作成、挿入、削除、更新、およびデータのクエリなど、基本的なデータベース操作を実装する方法について説明します。
前提条件
- OceanBaseデータベースがインストール済みであること。
- JDK 1.8とMavenがインストール済みであること。
- IntelliJ IDEAがインストール済みであること。
説明
この記事でコードを実行するために使用したツールは、IntelliJ IDEA 2021.3.2 (Community Edition)バージョンです。ご自身の好みに合わせて、適切なツールを選択してサンプルコードを実行することも可能です。
操作手順
説明
本記事で示されている操作手順は、Windows環境に基づいています。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
tomcat-oceanbase-clientプロジェクトをIDEAにインポートします。- OceanBaseデータベースへの接続情報を取得します。
tomcat-oceanbase-clientプロジェクトのデータベース接続情報を修正します。tomcat-oceanbase-clientプロジェクトのTomcat実行環境を構築します。tomcat-oceanbase-clientプロジェクトを実行します。
ステップ1:tomcat-oceanbase-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-oceanbase-clientプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベース接続情報を取得するに記載されている情報に基づいて、application.propertiesファイル内のデータベース接続情報を修正します。
例:
- データベースドライバーの名前:
com.oceanbase.jdbc.Driver - OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
SYSです。 - テナントの接続アカウントは
sys@xyoracleです。xyoracleはOceanBaseデータベース内に作成されたOracleモードのユーザーテナントであり、sysはテナントxyoracleのユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
#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/SYS?characterEncoding=UTF-8
#Database username
db.app.pool.username=sys@xyoracle
#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-oceanbase-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 Serverを選択し、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-oceanbase-clientプロジェクトを実行する
実行パス。
IDEAの上部のツールバーで、作成したTomcat実行のための設定を選択します。緑色の三角形の実行ボタンをクリックしてTomcatサーバーを起動します。Googleまたは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-oceanbase-clientをクリックして、プロジェクトコードをダウンロードします。これはtomcat-oceanbase-clientという名前の圧縮ファイルです。
解凍すると、tomcat-oceanbase-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-oceanbase-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。<packaging>を使用して、プロジェクトのパッケージング方式をWARファイル(Webアプリケーションアーカイブファイル)と指定します。
コード:
<groupId>com.oceanbase</groupId> <artifactId>tomcat-oceanbase-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ライブラリを利用して、データベース接続の取得と解放を管理および最適化できます。コード:
<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ライブラリを利用して、データベース接続の取得と解放を管理および最適化できます。コード:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.9.0</version> </dependency>依存関係が属する組織を
com.oceanbase、名前をoceanbase-client、バージョン番号を2.4.3と指定します。この依存関係を使用することで、OceanBaseが提供するクライアント機能(接続、クエリ、トランザクションなど)を利用できます。コード:
<dependencies> <dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.3</version> </dependency> </dependencies>
application.propertiesファイルの紹介
application.propertiesファイルは、OceanBaseデータベースへのデータベース接続情報を設定します。データベースドライバーのクラス名、接続URL、ユーザー名、パスワード、接続プールの関連設定を含みます。これらの構成パラメータは、アプリケーション内でデータベース接続を取得および管理し、データベース操作を実行するために使用されます。
db.app.pool.driverClassNameを使用してデータベースドライバーをcom.oceanbase.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を使用して、データベース接続のタイムアウト時間を5000 msに設定します。これは、データベースに接続しようとした際に、5000 msを超えても接続できない場合、タイムアウト例外が発生することを意味します。db.app.pool.validationQueryを使用して、データベース接続の有効性を検証するために使用するSQLクエリをselect 1 from dualと指定します。接続プールから接続を取得する際に、このクエリステートメントを実行して接続が有効かどうかを確認できます。コード:
#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:////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 from dual
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クラス:データベースの操作を実行するために使用されます。OracleDialectクラス:データベースの方言を指定するために使用されます。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.OracleDialect; 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メソッドで2回の接続エラー間の時間間隔を設定します。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 from dual"); 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 USER_TABLES WHERE 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 NUMBER(10), USERNAME VARCHAR2(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メソッドを使用してデータベースへのデータ挿入とデータクエリ操作を実行します。データを挿入します。
Recordオブジェクトを10個含むリスト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リストにストレージします。resultListリスト内の各Recordオブジェクトを拡張forループを使用してイテレーションします。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-oceanbase-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>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.3</version>
</dependency>
</dependencies>
</project>
#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://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 from dual
<?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.OracleDialect;
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 OracleDialect());
return activeRecordPlugin;
}
public void init() {
ActiveRecordPlugin arp = initDbConnection();
// Check if table exists
boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM USER_TABLES WHERE 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 NUMBER(10), USERNAME VARCHAR2(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-oceanbase-clientサンプルプロジェクトをダウンロード