本記事では、C3P0接続プール、OceanBase Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、挿入、削除、更新、クエリなどの基本的なデータベース操作を実現する方法について説明します。
前提条件
OceanBaseデータベースをインストールし、Oracleモードのテナントを作成済みであること。
JDK 1.8とMavenがインストール済みであること。
Eclipseがインストール済みであること。
説明
このドキュメントでは、Eclipse IDE for Java Developers 2022-03バージョンを使用してコードを実行しますが、ご自身の好みに合わせて適したツールを選択してサンプルコードを実行することもできます。
手順
説明
本記事で示されている操作手順は、Windows環境におけるEclipse IDE for Java Developers 2022-03を使用してこのプロジェクトをコンパイルおよび実行する方法です。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
c3p0-oceanbase-jdbcプロジェクトをEclipseにインポートします。- OceanBaseデータベースのURLを取得します。
c3p0-oceanbase-jdbcプロジェクト内のデータベース接続情報を修正します。c3p0-oceanbase-jdbcプロジェクトを実行します。
ステップ1:c3p0-oceanbase-jdbcプロジェクトをEclipseにインポートする
Eclipseを開き、メニューバーからFile->Open Projects from File Systemを選択します。
ポップアップダイアログで、Directoryボタンをクリックしてプロジェクトのディレクトリを選択し、Finishをクリックしてインポートを完了します。
説明
Eclipseを使用してMavenプロジェクトをインポートすると、プロジェクト内の
pom.xmlファイルを自動的に検出し、その記述に基づいて必要な依存ライブラリをダウンロードしてプロジェクトに追加します。
プロジェクトの状況を確認します。

ステップ2:OceanBaseデータベースのURLを取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@oracel001 -p******詳細については、OBClientを使用したOceanBaseテナントへの接続を参照してください。
OceanBaseデータベースの接続文字列情報を元に、以下のURLの対応する情報を入力します。
jdbc:oceanbase://$host:$port/$schema_name?user=$user_name&password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレスを指定します。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)経由での接続はODPアドレスを使用し、直接接続はOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポートを指定します。ODP経由での接続ではデフォルトで2883が使用されますが、ODPデプロイ時にカスタマイズ可能です。直接接続ではデフォルトで2881が使用されますが、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$schema_name:アクセス対象のスキーマ名を指定します。注意
テナントに接続するユーザーには、
CREATE SESSION権限と、該当するスキーマに対するCREATE TABLE、INSERT、DELETE、UPDATE、およびSELECT権限が必要です。ユーザー権限の詳細については、Oracleモードにおける権限の分類を参照してください。$user_name:テナントの接続アカウントを指定します。ODP経由での接続形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続形式:ユーザー名@テナント名。$password:アカウントのパスワードを指定します。
OceanBase Connector/JのURLパラメータの詳細については、データベースURLを参照してください。
例:
jdbc:oceanbase://xxx.xxx.xxx.xxx:2881/test_schema001?user=test_user001@oracel001&password=******
ステップ3:c3p0-oceanbase-jdbcプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、ファイル c3p0-oceanbase-jdbc/src/main/resources/c3p0-config.xml のデータベース接続情報を修正します。
例:
- OBServerノードのIPアドレスは
xxx.xxx.xxx.xxxです。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
test_schema001です。 - テナントの接続アカウントは
test_user001@oracle001です。oracle001はOceanBaseデータベース内で作成されたOracleモードのユーザーテナントであり、test_user001はテナントoracle001のユーザー名です。 - パスワードは
******です。
コード:
...
<property name="jdbcUrl">jdbc:oceanbase://xxx.xxx.xxx.xxx:2881/test_schema001?useSSL=false&useUnicode=true&characterEncoding=utf8</property>
<property name="user">test_user001@oracle001</property>
<property name="password">******</property>
...
ステップ4:c3p0-oceanbase-jdbcプロジェクトを実行する
プロジェクトナビゲータービューで、src/main/java ディレクトリを見つけて展開します。
Main.java ファイルを右クリックし、Run As -> Java Application を選択します。

Eclipseのコンソールウィンドウで、プロジェクトのログ情報と出力結果を確認します。

OceanBaseクライアント(OBClient)で以下のSQLステートメントを実行して結果を確認することもできます。
obclient [SYS]> SELECT * FROM test_schema001.test_c3p0;実行結果は次のとおりです:
+------+--------------+ | ID | NAME | +------+--------------+ | 5 | test_update | | 6 | test_insert6 | | 7 | test_insert7 | | 8 | test_insert8 | | 9 | test_insert9 | +------+--------------+ 5 rows in set
プロジェクトコードについて
c3p0-oceanbase-jdbc をクリックして、プロジェクトコードをダウンロードします。これは、c3p0-oceanbase-jdbc.zip という名前の圧縮ファイルです。
解凍すると、c3p0-oceanbase-jdbc という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
c3p0-oceanbase-jdbc
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── c3p0-config.xml
└── pom.xml
ファイルの説明:
src:ソースコードのルートディレクトリです。main:アプリケーションの主要なロジックを含むメインコードディレクトリです。java:Javaソースコードディレクトリです。com:Javaパッケージディレクトリです。example:サンプルプロジェクトのパッケージディレクトリです。Main.java:メインクラスで、テーブルの作成やデータの挿入などのロジックが含まれます。resources:設定ファイルなどを含むリソースファイルディレクトリです。c3p0-config.xml:C3P0接続プールの設定ファイルです。pom.xml:プロジェクトの依存関係とビルド設定を管理するために使用されるMavenプロジェクトの設定ファイルです。
pom.xmlコードの紹介
pom.xml ファイルはMavenプロジェクトの設定ファイルであり、プロジェクトの依存関係、プラグイン、ビルドルールなどの情報を定義しています。MavenはJavaプロジェクト管理ツールであり、依存関係のダウンロード、プロジェクトのコンパイル、パッケージングなどの操作を自動化できます。
本記事の pom.xml ファイルのコードには、主に以下のいくつかの部分が含まれます:
ファイル宣言ステートメントです。
このファイルがXMLファイルであり、使用しているXMLのバージョンが
1.0で、文字エンコーディング方式がUTF-8であることを宣言しています。コード:
<?xml version="1.0" encoding="UTF-8"?>POMのネームスペースとPOMモデルのバージョンを設定します。
xmlnsを使用して、POMのネームスペースをhttp://maven.apache.org/POM/4.0.0と指定します。xmlns:xsiを使用して、XMLネームスペースをhttp://www.w3.org/2001/XMLSchema-instanceと指定します。xsi:schemaLocationを使用して、POMのネームスペースをhttp://maven.apache.org/POM/4.0.0、POMのXSDファイルの場所をhttp://maven.apache.org/xsd/maven-4.0.0.xsdと指定します。<modelVersion>要素を使用して、このPOMファイルで使用されるPOMモデルのバージョンを4.0.0と指定します。
コード:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- その他の設定 --> </project>基本情報を設定します。
<groupId>を使用して、プロジェクトが属する組織をcom.exampleと指定します。<artifactId>を使用して、プロジェクトの名前をtestc3p0と指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>com.example</groupId> <artifactId>testc3p0</artifactId> <version>1.0-SNAPSHOT</version>プロジェクトソースファイルのプロパティを設定します。
Mavenのコンパイラプラグインを
maven-compiler-pluginと指定し、ソースコードとターゲットJavaバージョンをどちらも8に設定します。これは、プロジェクトのソースコードがJava 8の機能を使用して記述されており、コンパイル後のバイトコードもJava 8ランタイム環境と互換性があることを意味します。このような設定により、プロジェクトはコンパイル時および実行時にJava 8の構文と機能を正しく処理できるようになります。説明
Java 1.8とJava 8は、同じバージョンの異なる命名方法です。
コード:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build>プロジェクトが依存するコンポーネントを設定します。
説明
このセクションのコードでは、プロジェクトが依存するコンポーネントとしてOceanBase Connector/JのV2.4.2バージョンを定義しています。他のバージョンに関する情報については、OceanBase JDBCドライバーを参照してください。
<dependency>を使用して依存関係を定義します:oceanbase-client依存関係:
<groupId>を使用して、依存関係が属する組織をcom.oceanbaseと指定します。<artifactId>を使用して、依存関係の名前をoceanbase-clientと指定します。<version>を使用して、依存関係のバージョン番号を2.4.2と指定します。
C3P0依存関係:
<groupId>を使用して、依存関係が属する組織をcom.mchangeと指定します。<artifactId>を使用して、依存関係の名前をc3p0と指定します。<version>を使用して、依存関係のバージョン番号を0.9.5.5と指定します。
コード:
<dependencies> <dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> </dependencies>
c3p0-config.xmlコードの紹介
c3p0-config.xml ファイルは、C3P0接続プールの設定ファイルであり、データベースとの接続に関連するプロパティを設定するために使用されます。各 <property> 要素の値を設定することで、データベースドライバー、接続URL、ユーザー名、パスワード、接続プールサイズなどのプロパティを設定できます。
本記事の c3p0-config.xml ファイルのコードには、主に以下のいくつかの部分が含まれます:
ファイル宣言ステートメントです。
このファイルがXMLファイルであり、使用しているXMLのバージョンが
1.0で、文字エンコーディング方式がUTF-8であることを宣言しています。コード:
<?xml version="1.0" encoding="UTF-8"?>基本情報を設定します。
<c3p0-config>を使用して、c3p0接続プールの設定情報を含みます。<named-config name="oceanbase">を使用して、oceanbaseという名前の具名構成を定義します。コード内でこの名前を使用して具名構成を参照し、oceanbaseデータベースに関連する接続情報と接続プールプロパティを取得できます。
コード:
<c3p0-config> <named-config name="oceanbase"> // 各 <property> 要素の値を設定 </named-config> </c3p0-config>データベースドライバーを設定します。
<property>を使用して、OceanBaseデータベースへの接続時に使用されるJDBCドライバーのクラス名をcom.oceanbase.jdbc.Driverと指定します。説明
OceanBase Connector/J実装クラスの名前に関する情報については、OceanBase Javaデータベース接続ドライバーを参照してください。
コード:
<property name="driverClass">com.oceanbase.jdbc.Driver</property>データベース接続情報を設定します。
- データベース接続のURLを設定します。これには、ホストIPアドレス、ポート番号、アクセスするスキーマ、およびURLパラメータなどが含まれます。
- データベースのユーザー名を設定します。
- データベースのパスワードを設定します。
コード:
<property name="jdbcUrl">jdbc:oceanbase://$host:$port/$schema_name?useSSL=false&useUnicode=true&characterEncoding=utf8</property> <property name="user">$user_name</property> <property name="password">$password</property>パラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレスを提供します。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポートを提供します。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$schema_name:アクセスするスキーマの名前です。その他のパラメータは以下のとおりです:
useSSL=false:SSL暗号化を無効にし、セキュリティソケット層を使用してデータ転送を保護しないことを示します。seUnicode=true:Unicode文字エンコーディングを有効にし、さまざまな文字セットを正しく処理できるようにします。characterEncoding=utf8:UTF-8文字エンコーディングを使用することを指定します。&:XMLエントリ参照であり、&文字を表すために使用されます。XMLでは、&は特別な文字であり、XML構文と競合しないようにするためにエントリ参照を使用する必要があります。より多くのURLパラメータの説明については、データベースURLを参照してください。
$user_name:テナントの接続アカウントを提供します。ODP接続方式の形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワードを提供します。
他のc3p0データベース接続プールの設定項目を設定します。
- 接続プールが必要なときに一度に取得する接続数を20に設定します。つまり、接続プール内の接続が不足している場合、各回の取得接続数は20になります。
- 接続プールの初期サイズを10に設定します。つまり、接続プールは起動時に事前に10個の接続を作成します。
- 接続プールの最小接続数を5に設定します。つまり、接続プールで維持される最小接続数は5以上となります。
- 接続プールの最大接続数を30に設定します。つまり、接続プールで許可される最大接続数は30を超えないことになります。
- 各接続の最大キャッシュステートメント数を0に設定します。つまり、ステートメントをキャッシュしません。
- 各接続の接続プールにおける最大キャッシュステートメント数を0に設定します。つまり、各接続はステートメントをキャッシュしません。
- c3p0が使用する補助スレッド数を3に設定します。これらの補助スレッドは、遅延したJDBC操作を実行するために使用されます。
- c3p0接続のプロパティチェックサイクルを3秒に設定します。つまり、3秒ごとに接続のプロパティをチェックします。
- 接続取得のタイムアウト時間を1000ミリ秒に設定します。つまり、1000ミリ秒以内に接続を取得できない場合、タイムアウト例外がスローされます。
- 接続プール内のアイドル接続のチェックサイクルを3秒に設定します。つまり、3秒ごとにアイドル接続の状態をチェックします。
- 接続プール内の接続の最大アイドル時間を10秒に設定します。つまり、接続が10秒以内に使用されない場合、接続が閉じられます。
- 接続プール内の最大接続数を超える接続の最大アイドル時間を5秒に設定します。つまり、接続が最大接続数を超えていてかつアイドル状態が5秒以上続く場合、接続が閉じられます。
- 接続取得時の再試行遅延時間を1000ミリ秒に設定します。つまり、接続取得に失敗した場合、1000ミリ秒後に再度試行します。
- c3p0の自動テストテーブルを "test" に設定します。これは、接続が有効かどうかをテストするために使用される特別なテーブルです。
- 接続プールに接続を返却する際に、接続の有効性をテストするかどうかを設定します。trueに設定すると、接続が接続プールに返却された際に接続の有効性テストが行われます。
コード:
<property name="acquireIncrement">20</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">30</property> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">0</property> <property name="numHelperThreads">3</property> <property name="propertyCycle">3</property> <property name="checkoutTimeout">1000</property> <property name="idleConnectionTestPeriod">3</property> <property name="maxIdleTime">10</property> <property name="maxIdleTimeExcessConnections">5</property> <property name="acquireRetryDelay">1000</property> <property name="automaticTestTable">test</property> <property name="testConnectionOnCheckin">true</property>
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件やデータベースの特性によって異なります。実際の状況に応じて調整と設定を行うことを推奨します。さらに詳しいC3P0接続プールの構成パラメータ情報については、C3P0を参照してください。
C3P0接続プールの一般的な基本設定項目:
| カテゴリ | プロパティ | デフォルト値 | 説明 |
|---|---|---|---|
| 必須項目 | driverClass | N/A | ドライバークラス名 |
| jdbcUrl | N/A | データベースの接続URLを指定するために使用されます。 | |
| user | N/A | データベースへの接続時に使用するユーザー名を指定するために使用されます。 | |
| password | N/A | データベースへの接続時に使用するパスワードを指定するために使用されます。 | |
| 基本設定 | acquireIncrement | 3 | 接続プールで必要に応じて一度に取得する接続数を設定するために使用されます。例えば、acquireIncrement の値が20の場合、接続プール内の現在の空き接続が5個しかない場合、接続を取得する際に、接続プールが一度に20個の新しい接続を作成し、アプリケーションの要件を満たします。 |
| acquireRetryAttempts | 30 | データベースから新しい接続を取得できなかった場合の再試行回数を設定するために使用されます。この値がゼロ以下の場合、C3P0は無限に接続を取得するよう継続的に試行します。 | |
| maxIdleTime | 0 | 接続プール内の接続の最大アイドル時間を設定するために使用されます。0はアイドル接続が期限切れになることはないと示します。例えば、maxIdleTime を10秒に設定すると、接続プール内の接続が10秒以上のアイドル時間後に使用されない場合、接続プールによって接続が終了し、削除されます。次回アプリケーションが再び接続を要求する際、接続プールは新しい接続を作成します。 |
|
| maxPoolSize | 15 | 接続プール内の最大接続数を設定するために使用されます。接続プール内の接続数が maxPoolSize で指定された値に達すると、新しい接続リクエストは接続が接続プールに返却されるまでブロックされます。 |
|
| MinPoolSize | 3 | 接続プール内の最小接続数を設定するために使用されます。接続が使用されない場合でも、接続プールは少なくとも minPoolSize で指定された数の接続を維持します。 |
|
| initialPoolSize | 3 | 接続プールが起動時に事前に作成する接続数を設定するために使用されます。値は minPoolSiz と maxPoolSize の間でなければなりません。つまり、接続プールが初期化される際、initialPoolSize で指定された数の接続が作成されます。 |
|
| オプションの設定項目 | acquireRetryDelay | 1000 | 接続取得時の再試行遅延時間を設定するために使用されます。単位はミリ秒です。アプリケーションが接続プールから接続を取得する際、接続プールに利用可能な接続がない場合、接続取得に失敗する可能性があります。このとき、接続プールは acquireRetryDelay の設定に基づいて再試行を行います。 |
| autoCommitOnClose | false | 接続クローズ時にトランザクションを自動コミットするかどうかを設定するために使用されます。デフォルト値は false であり、接続がクローズされた際にトランザクションは自動的にコミットされません。アプリケーションが接続クローズ前に明示的にトランザクションをコミットする必要がある場合は、autoCommitOnClose を true に設定できます。
注意自動トランザクションコミットは、データの一貫性や損失を引き起こす可能性があるため、トランザクションの整合性を確保した上で慎重に |
|
| automaticTestTable | null | 接続プールの自動テストテーブルを設定するために使用されます。C3P0は指定された名前の空のテーブルを作成し、そのテーブルに対するクエリを使用してConnectionをテストします。デフォルト値は null であり、テストステートメントが実行されないことを示します。例えば、automaticTestTable を test に設定すると、C3P0は test という名前の空のテーブルを作成し、独自のクエリステートメントを使用してテストを行います。
説明接続プールで |
|
| idleConnectionTestPeriod | 0 | 接続プールがアイドル接続検出を実行する時間間隔を設定するために使用されます。単位はミリ秒です。つまり、接続プールは一定の時間間隔でアイドル接続をテストします。デフォルト値は0であり、アイドル接続検出が行われないことを示します。 | |
| maxStatements | 0 | 接続プールの最大プリペアドステートメント数を設定するために使用されます。
説明
|
|
| maxStatementsPerConnection | 0 | 各接続に存在できる最大プリペアドステートメント数を設定するために使用されます。
説明
|
|
| numHelperThreads | 3 | 非同期タスクの処理に使用する補助スレッドの数を指定するために使用されます。
説明
|
|
| preferredTestQuery | null | すべての接続テストで実行されるテストステートメントを定義します。接続テストを使用する場合、この機能によりテスト速度が大幅に向上します。
注意テスト用のテーブルは、初期データソースの時点で存在している必要があります。 |
|
| checkoutTimeout | 0 | 接続プールから接続を取得するためのタイムアウト時間を指定するために使用されます。単位はミリ秒です。デフォルト値は0であり、タイムアウト制限がないことを示します。接続プールが枯渇した場合、クライアントが getConnection() を呼び出して新しい接続を取得するまでの待機時間で、タイムアウトが発生した場合、SQLException がスローされます。 |
|
| 推奨されない設定項目 | breakAfterAcquireFailure | false | 接続取得に失敗した場合に、接続プールの取得操作を中断するかどうかを制御するために使用されます。接続取得に失敗すると、すべての接続プールから接続を取得するために待機しているスレッドが例外をスローします。しかし、データソースは依然として有効に保持され、次回 getConnection() を呼び出す際に再び接続を取得しようとします。
|
| testConnectionOnCheckout | false | 接続プールから接続を取得する際に、接続をテストするかどうかを指定するために使用されます。
説明接続テストを実行すると、接続が有効であることが保証されますが、一定の追加オーバーヘッドも生じます。そのため、接続テストを有効にするかどうかは、具体的なアプリケーション要件とパフォーマンス要件に基づいて決定する必要があります。アプリケーションが接続の可用性に対する要件が高い場合、接続テストを有効にできます。ただし、接続プール内の接続が頻繁に取得および解放される場合、接続テストが過度に頻繁に行われ、パフォーマンスに影響を与える可能性があります。 |
|
| testConnectionOnCheckin | false | 接続を接続プールに返却する際に、接続をテストするかどうかを指定するために使用されます。
説明接続テストを実行すると、接続が有効であることが保証されますが、一定の追加オーバーヘッドも生じます。そのため、接続テストを有効にするかどうかは、具体的なアプリケーション要件とパフォーマンス要件に基づいて決定する必要があります。アプリケーションが接続の可用性に対する要件が高い場合、接続テストを有効にできます。ただし、接続プール内の接続が頻繁に取得および返却される場合、接続テストが過度に頻繁に行われ、パフォーマンスに影響を与える可能性があります。 |
Main.javaコードの紹介
Main.java ファイルはサンプルプログラムの一部であり、c3p0接続プールを使用してデータベース接続を取得し、トランザクション内で一連のデータベース操作を実行する方法を示しています。これには、テーブルの作成、データの挿入、データの削除、データの更新、データのクエリ、およびクエリ結果の出力が含まれます。このファイルは、c3p0接続プールを使用してデータベース接続を管理し、トランザクション操作を実行することで、データベース操作の効率とパフォーマンスを向上させる方法を示しています。
本記事の Main.java ファイルのコードには、主に以下のいくつかの部分が含まれます:
パッケージを定義し、
java.sqlのインターフェースをインポートします。- 現在のコードが属するパッケージ名を
com.exampleとして宣言します。 java.sql.Connectionクラスをインポートし、データベース接続を表すために使用されます。java.sql.PreparedStatementクラスをインポートし、プリコンパイル済みのデータベース操作を実行するために使用されます。java.sql.ResultSetクラスをインポートし、データベースクエリ結果セットを表すために使用されます。com.mchange.v2.c3p0.ComboPooledDataSourceクラスをインポートし、c3p0接続プールを使用するために使用されます。
コード:
package com.example; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.mchange.v2.c3p0.ComboPooledDataSource;- 現在のコードが属するパッケージ名を
クラス名とメソッドを定義します。
- プログラムのエントリポイントとして、
Mainという名前のパブリッククラスを定義します。クラス名はファイル名と一致させる必要があります。 - プログラムの開始実行点として、パブリック静的メソッド
mainを定義します。 try-with-resourcesステートメントを使用して、データベース接続を取得し、プリコンパイル済みのSQLステートメントを作成します。- データベーストランザクション操作。
- 発生する可能性のある例外をキャッチし、例外スタック情報を出力します。
- c3p0接続プールからデータベース接続を取得するためのプライベート静的メソッド
getConnectionを定義します。メソッド内部では、最初にComboPooledDataSourceオブジェクトcpdsを作成し、このオブジェクトはパラメータoceanbaseを使用して接続プールの設定を指定します。次に、cpds.getConnection()メソッドを使用して接続プールからデータベース接続を取得し、それを返します。
コード:
public class Main { public static void main(String[] args) { try ( // データベース接続を取得する // プリコンパイル済みのSQLステートメントを作成する ) { // データベーストランザクション操作:トランザクションの開始、テーブルの作成、データの挿入、データの削除、データの更新、データのクエリ、およびトランザクションのコミット } catch (Exception e) { e.printStackTrace(); } } private static Connection getConnection() throws Exception { ComboPooledDataSource cpds = new ComboPooledDataSource("oceanbase"); return cpds.getConnection(); } }- プログラムのエントリポイントとして、
データベース接続を取得します。
データベース接続を取得し、
conn変数に代入します。コード:
Connection conn = getConnection();プリコンパイルSQLステートメントを作成します。
test_c3p0という名前のデータベーステーブルを作成するためのプリコンパイルSQLステートメントを作成します。test_c3p0テーブルにデータを挿入するためのプリコンパイルSQLステートメントを作成します。test_c3p0テーブルからデータを削除するためのプリコンパイルSQLステートメントを作成します。test_c3p0テーブル内のデータを更新するためのプリコンパイルSQLステートメントを作成します。test_c3p0テーブルからデータをクエリするためのプリコンパイルSQLステートメントを作成します。
コード:
PreparedStatement stmtCreate = conn.prepareStatement("CREATE TABLE test_c3p0 (id NUMBER, name VARCHAR2(32))"); PreparedStatement stmtInsert = conn.prepareStatement("INSERT INTO test_c3p0 VALUES (?, ?)"); PreparedStatement stmtDelete = conn.prepareStatement("DELETE FROM test_c3p0 WHERE id < ?"); PreparedStatement stmtUpdate = conn.prepareStatement("UPDATE test_c3p0 SET name = ? WHERE id = ?"); PreparedStatement stmtSelect = conn.prepareStatement("SELECT * FROM test_c3p0")トランザクションを開始します。
データベース接続の自動コミットを
falseに設定します。つまり、トランザクションを開始します。コード:
conn.setAutoCommit(false);テーブルを作成します。
テーブル作成のSQLステートメントを実行します。
コード:
stmtCreate.execute();データを挿入します。
forループを使用して、test_c3p0テーブルに10件のデータを挿入します。1列目の値は変数iの値、2列目の値は文字列test_insertに変数iの値を追加したものです。コード:
for (int i = 0; i < 10; i++) { stmtInsert.setInt(1, i); stmtInsert.setString(2, "test_insert" + i); stmtInsert.executeUpdate(); }データを削除します。
削除ステートメントのパラメータを5に設定し、削除操作を実行します。
コード:
stmtDelete.setInt(1, 5); stmtDelete.executeUpdate();データを更新します。
更新ステートメントの最初のパラメータを
test_update、2番目のパラメータを5に設定し、更新操作を実行します。コード:
stmtUpdate.setString(1, "test_update"); stmtUpdate.setInt(2, 5); stmtUpdate.executeUpdate();データをクエリします。
- クエリステートメントを実行し、クエリ結果を
ResultSetオブジェクトrsに保存します。 - whileループを使用して、rs.next() で結果セットに次の行のデータがあるかどうかを判断します。ある場合は、ループ内のコードを実行します。
- ループ内のコードは、各行の
id列とname列の値を出力します。 - 結果セットをクローズし、関連リソースを解放します。
コード:
ResultSet rs = stmtSelect.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("id") + " " + rs.getString("name")); } rs.close();- クエリステートメントを実行し、クエリ結果を
トランザクションをコミットします。
コード:
conn.commit();
全コード表示
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="oceanbase">
<!-- Configure Database Driver -->
<property name="driverClass">com.oceanbase.jdbc.Driver</property>
<!-- Configure Database Link Address -->
<property name="jdbcUrl">jdbc:oceanbase://$host:$port/$schema_name?useSSL=false&useUnicode=true&characterEncoding=utf8</property>
<!-- Configure database username -->
<property name="user">$user_name</property>
<!-- Configure database password -->
<property name="password">$password</property>
<!-- How many connection objects does the database Connection pool want from the database at one time -->
<property name="acquireIncrement">20</property>
<!-- Initialize connections -->
<property name="initialPoolSize">10</property>
<!-- Minimum number of connections -->
<property name="minPoolSize">5</property>
<!-- The maximum number of connections reserved in the Connection pool. Default: 15 -->
<property name="maxPoolSize">30</property>
<!-- JDBC standard parameter used to control the number of PreparedStatements loaded within the data source. However, the pre cached statements belong to a single connection rather than the entire Connection pool. So setting this parameter requires considering multiple factors. If both maxStatements and maxStatementsPerConnection are 0, the cache is turned off. Default:0 -->
<property name="maxStatements">0</property>
<!-- MaxStatementsPerConnection defines the maximum number of cached statements owned by a single connection in the Connection pool. Default: 0 -->
<property name="maxStatementsPerConnection">0</property>
<!-- C3p0 is an asynchronous operation, and slow JDBC operations are completed by the helper process. Expanding these operations can effectively improve performance by enabling multiple operations to be executed simultaneously through multithreading. Default:3 -->
<property name="numHelperThreads">3</property>
<!-- The user can wait up to 300 seconds before modifying the system configuration parameters. Default: 300 -->
<property name="propertyCycle">3</property>
<!-- The default setting for obtaining the connection timeout is to wait for a unit of milliseconds -->
<property name="checkoutTimeout">1000</property>
<!-- Check all free connections in the Connection pool every few seconds. Default: 0 -->
<property name="idleConnectionTestPeriod">3</property>
<!-- The maximum idle time, within seconds, if not used, the connection will be discarded. If it is 0, it will never be discarded. Default: 0 -->
<property name="maxIdleTime">10</property>
<!-- Configure the lifetime of the connection. Connections beyond this time will be automatically disconnected and discarded by the Connection pool. Of course, the connection being used will not be immediately disconnected, but will wait for it to close before disconnecting. When configured to 0, there is no restriction on the lifetime of the connection. -->
<property name="maxIdleTimeExcessConnections">5</property>
<!-- The interval time between two connections, in milliseconds. Default: 1000 -->
<property name="acquireRetryDelay">1000</property>
<!-- C3p0 will create an empty table called Test and use its built-in query statement for testing. If this parameter is defined, the property preferredTestQuery will be ignored. You cannot perform any operations on this Test table, it will only be used for c3p0 testing. Default: null -->
<property name="automaticTestTable">test</property>
<!-- Test if the connection is valid when obtaining it -->
<property name="testConnectionOnCheckin">true</property>
</named-config>
</c3p0-config>
package com.example;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Main {
public static void main(String[] args) {
try (Connection conn = getConnection();
PreparedStatement stmtCreate = conn.prepareStatement("CREATE TABLE test_c3p0 (id NUMBER, name VARCHAR2(32))");
PreparedStatement stmtInsert = conn.prepareStatement("INSERT INTO test_c3p0 VALUES (?, ?)");
PreparedStatement stmtDelete = conn.prepareStatement("DELETE FROM test_c3p0 WHERE id < ?");
PreparedStatement stmtUpdate = conn.prepareStatement("UPDATE test_c3p0 SET name = ? WHERE id = ?");
PreparedStatement stmtSelect = conn.prepareStatement("SELECT * FROM test_c3p0")) {
conn.setAutoCommit(false);
stmtCreate.execute();
for (int i = 0; i < 10; i++) {
stmtInsert.setInt(1, i);
stmtInsert.setString(2, "test_insert" + i);
stmtInsert.executeUpdate();
}
stmtDelete.setInt(1, 5);
stmtDelete.executeUpdate();
stmtUpdate.setString(1, "test_update");
stmtUpdate.setInt(2, 5);
stmtUpdate.executeUpdate();
ResultSet rs = stmtSelect.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
rs.close();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
private static Connection getConnection() throws Exception {
ComboPooledDataSource cpds = new ComboPooledDataSource("oceanbase");
return cpds.getConnection();
}
}
参照ドキュメント
OceanBase Connector/Jの詳細については、OceanBase JDBCドライバーを参照してください。
クリックしてc3p0-oceanbase-jdbcサンプルプロジェクトをダウンロード
C3P0接続プールによるOceanBaseデータベースへの接続サンプルプログラム(Oracleモード)