本記事では、C3P0接続プール、MySQL Connector/J、およびOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、削除、更新、クエリなどの基本的なデータベース操作を実現する方法について説明します。
前提条件
OceanBaseデータベースをインストールし、MySQLテナントを作成していること。
JDK 1.8とMavenをインストールしていること。
Eclipseをインストールしていること。
説明
このドキュメントでコードを実行するために使用されているツールはEclipse IDE for Java Developers 2022-03バージョンですが、個人の好みに応じて適したツールを選択してサンプルコードを実行することもできます。
手順
説明
ここで説明する手順は、Windows環境でEclipse IDE for Java Developers 2022-03を使用してこのプロジェクトをコンパイルおよび実行する場合のものです。他のOS環境やコンパイラを使用する場合は、手順が若干異なる可能性があります。
c3p0-mysql-jdbcプロジェクトをEclipseにインポートします。- OceanBaseデータベースのURLを取得します。
c3p0-mysql-jdbcプロジェクト内のデータベース接続情報を変更します。c3p0-mysql-jdbcプロジェクトを実行します。
ステップ1:c3p0-mysql-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@mysql001 -p****** -Dtest接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
OceanBaseデータベースの接続文字列情報に基づいて、以下のURLの対応する情報を入力します。
jdbc:mysql://$host:$port/$database_name?user=$user_name&password=$passwordパラメータ説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセスするデータベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、DELETE、UPDATEおよびSELECT権限が付与されていなければなりません。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続方式の形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
MySQL Connector/J接続プロパティの詳細については、Configuration Propertiesを参照してください。
例:
jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?user=test_user001@mysql001&password=******
ステップ3:c3p0-mysql-jdbcプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、ファイルc3p0-mysql-jdbc/src/main/resources/c3p0-config.xml内のデータベース接続情報を修正します。
例:
- OBServerノードのIPアドレスは
xxx.xxx.xxx.xxxです。 - アクセスポートは2881を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
test_user001@mysql001です。mysql001はOceanBaseデータベースで作成されたMySQLモードのユーザーテナントであり、test_user001はテナントmysql001のユーザー名です。 - パスワードは
******です。
コード:
...
<property name="jdbcUrl">jdbc:mysql://xxx.xxx.xxx.xxx:2881/test</property>
<property name="user">test_user001@mysql001</property>
<property name="password">******</property>
...
ステップ4:c3p0-mysql-jdbcプロジェクトを実行する
プロジェクトナビゲータービューで、src/main/javaディレクトリを見つけて展開します。
Main.javaファイルを右クリックし、Run As->Java Applicationを選択します。

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

OceanBaseクライアント(OBClient)で以下のSQLステートメントを実行して結果を確認することもできます。
obclient [test]> SELECT * FROM test_c3p0;戻り値は次のとおりです:
+------+--------------+ | id | name | +------+--------------+ | 5 | test_update | | 6 | test_insert6 | | 7 | test_insert7 | | 8 | test_insert8 | | 9 | test_insert9 | +------+--------------+ 5 rows in set
プロジェクトコードについて
c3p0-mysql-jdbc をクリックして、プロジェクトコードをダウンロードします。これは、c3p0-mysql-jdbc.zip という名前の圧縮ファイルです。
解凍すると、c3p0-mysql-jdbc という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
c3p0-mysql-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>プロジェクトが依存するコンポーネントの設定。
説明
この部分のコードは、プロジェクトが依存するコンポーネントがMySQL Connector/Jの8.0.25バージョンであることを定義しています。他のバージョンの情報については、MySQL Connector/Jを参照してください。
<dependency>を使用して依存関係を定義します:mysql-connector-java依存ライブラリの追加:
<groupId>を使用して、依存関係が属する組織をmysqlと指定します。<artifactId>を使用して、依存関係の名前をmysql-connector-javaと指定します。<version>を使用して、依存関係のバージョン番号を8.0.25と指定します。
c3p0依存ライブラリの追加:
<groupId>を使用して、依存関係が属する組織をcom.mchangeと指定します。<artifactId>を使用して、依存関係の名前をc3p0と指定します。<version>を使用して、依存関係のバージョン番号を0.9.5.5と指定します。
コード:
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</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データベースへの接続時に使用するMySQL JDBCドライバーのクラス名をcom.mysql.cj.jdbc.Driverと指定します。説明
MySQL Connector/J実装クラスの名前情報については、Driver/Datasource Class Nameを参照してください。
コード:
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>データベース接続情報の設定。
- データベース接続のURLを設定します。これには、ホストIPアドレス、ポート番号、アクセスするデータベース、URLパラメータなどの情報が含まれます。
- データベースのユーザー名を設定します。
- データベースのパスワードを設定します。
コード:
<property name="jdbcUrl">jdbc:mysql://$host:$port/$database_name</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データベースのデプロイ時にカスタマイズ可能です。$database_name:アクセスするデータベースの名前。$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 | データベースから新しい接続の取得に失敗した場合の再試行回数を設定します。この値が0以下の場合、C3P0は無限に接続の取得を試行し続けます。 | |
| maxIdleTime | 0 | 接続プール内の接続の最大アイドル時間を設定します。0はアイドル接続が期限切れにならないことを意味します。例えば、maxIdleTime を10秒に設定すると、接続プール内の接続が10秒以上アイドル状態のまま使用されない場合、接続プールによって閉じられ、削除されます。次回アプリケーションが再び接続を要求すると、接続プールは新しい接続を再作成します。 |
|
| maxPoolSize | 15 | 接続プール内の最大接続数を設定します。接続プール内の接続数が maxPoolSize で指定された値に達すると、新しい接続要求は、接続が接続プールに解放されるまでブロックされます。 |
|
| MinPoolSize | 3 | 接続プール内の最小接続数を設定します。接続が使用されていない場合でも、接続プールは少なくとも minPoolSiz で指定された数の接続を維持します。 |
|
| 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クラスをインポートします。 - c3p0接続プールを使用するために使用される
com.mchange.v2.c3p0.ComboPooledDataSourceクラスをインポートします。
コード:
package com.example; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.mchange.v2.c3p0.ComboPooledDataSource;- 現在のコードが属するパッケージ名を
クラス名とメソッドの定義。
- プログラムのエントリポイントとして、
Mainという名前のpublicクラスを定義します。クラス名はファイル名と一致させる必要があります。 - プログラムの実行開始点として、public staticメソッド
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 INT, name VARCHAR(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();- クエリステートメントを実行し、クエリ結果を
トランザクションのコミット。
**コード:**
```java
conn.commit();
```
全コード表示
<?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>testc3p0</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="oceanbase">
<!-- Configure Database Driver -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!-- Configure Database Link Address -->
<property name="jdbcUrl">jdbc:mysql://$host:$port/$database_name</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 INT, name VARCHAR(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")) {
// Begin transaction
conn.setAutoCommit(false);
// Create table
stmtCreate.execute();
// Insert data
for (int i = 0; i < 10; i++) {
stmtInsert.setInt(1, i);
stmtInsert.setString(2, "test_insert" + i);
stmtInsert.executeUpdate();
}
// Delete data
stmtDelete.setInt(1, 5);
stmtDelete.executeUpdate();
// Update data
stmtUpdate.setString(1, "test_update");
stmtUpdate.setInt(2, 5);
stmtUpdate.executeUpdate();
// Query data
ResultSet rs = stmtSelect.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
rs.close();
// Commit transaction
conn.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
private static Connection getConnection() throws Exception {
ComboPooledDataSource cpds = new ComboPooledDataSource("oceanbase");
return cpds.getConnection();
}
}
関連ドキュメント
MySQL Connector/Jの詳細については、MySQL Connector/Jの概要を参照してください。
c3p0-mysql-jdbc サンプルプロジェクトをダウンロード