本記事では、Druid接続プール、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環境やコンパイラを使用する場合は、手順が若干異なる可能性があります。
druid-oceanbase-clientプロジェクトをEclipseにインポートします。- OceanBaseデータベースのURLを取得します。
druid-oceanbase-clientプロジェクト内のデータベース接続情報を修正します。druid-oceanbase-clientプロジェクトを実行します。
ステップ1:druid-oceanbase-clientプロジェクトを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:アクセスするSchema名。注意
テナントに接続するユーザーには、
CREATE SESSION権限およびそのSchemaに対するCREATE TABLE、DROP 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:druid-oceanbase-clientプロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースのURLを取得するで取得した情報に基づいて、druid-oceanbase-client/src/main/resources/db.properties ファイル内のデータベース接続情報を修正します。

例:
- OBServerノードのIPアドレスは
xxx.xxx.xxx.xxxです。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
test_schema001です。 - テナントの接続アカウントは
test_user001@oracle001です。oracle001はOceanBaseデータベースで作成されたOracleモードのユーザーテナントであり、test_user001はテナントoracle001のユーザー名です。 - パスワードは
******です。
コード:
...
url=jdbc:oceanbase://xxx.xxx.xxx.xxx:2881/test_schema001
username=test_user001@oracle001
password=******
...
ステップ4:druid-oceanbase-clientプロジェクトを実行する
プロジェクトナビゲータービューで、druid-oceanbase-client/src/main/java ディレクトリを見つけて展開します。
Main.java ファイルを右クリックし、Run As->Java Application を選択します。

Eclipseのコンソールウィンドウで出力結果を確認します。

プロジェクトコードについて
druid-oceanbase-client をクリックしてプロジェクトコードをダウンロードします。これは、druid-oceanbase-client.zip という名前の圧縮ファイルです。
解凍すると、druid-oceanbase-client という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
druid-oceanbase-client
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
ファイルの説明:
src:ソースコードのルートディレクトリです。main:アプリケーションの主要なロジックを含むメインコードディレクトリです。java:Javaソースコードディレクトリです。com:Javaパッケージディレクトリです。example:サンプルプロジェクトのパッケージディレクトリです。Main.java:テーブルの作成、データの挿入、削除、更新、クエリなどのロジック処理を含むメインクラスプログラムのサンプルファイルです。resources:設定ファイルなどを含むリソースファイルディレクトリです。db.properties:データベース接続に関するパラメータを含む接続プールの設定ファイルです。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>を使用して、プロジェクトの名前をdruid-oceanbase-clientと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>com.example</groupId> <artifactId>druid-oceanbase-client</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-client依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をcom.oceanbaseと指定します。<artifactId>を使用して、依存関係の名前をoceanbase-clientと指定します。<version>を使用して、依存関係のバージョン番号を2.4.2と指定します。
<main id="notice" type='explain'> <h4>説明</h4> <p>このセクションのコードは、プロジェクトが依存するコンポーネントがOceanBase Connector/JのV2.4.2バージョンであることを定義しています。他のバージョンの情報については、<a href="https://en.oceanbase.com/docs/common-oceanbase-connector-j-en-10000000001092963">OceanBase JDBCドライバ</a> を参照してください。</p> </main> **コード:** ```java <dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.2</version> </dependency> ```druid依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をcom.alibabaと指定します。<artifactId>を使用して、依存関係の名前をdruidと指定します。<version>を使用して、依存関係のバージョン番号を1.2.8と指定します。
**コード:** ```java <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> ```
db.propertiesコードの紹介
db.properties は本記事の例となる接続プールの設定ファイルであり、接続プールの設定プロパティが含まれています。これらのプロパティには、データベースURL、ユーザー名、パスワード、接続プールのその他のオプションが含まれます。
本記事の db.properties ファイルのコードは、主に以下の部分で構成されています:
データベース接続パラメータの設定
- データベースドライバーのクラス名を
com.oceanbase.jdbc.Driverと指定します。 - データベース接続のURLを指定します。これには、ホストIPアドレス、ポート番号、アクセスするスキーマが含まれます。
- データベースのユーザー名を指定します。
- データベースのパスワードを指定します。
コード:
driverClassName=com.oceanbase.jdbc.Driver url=jdbc:oceanbase://$host:$port/$schema_name username=$user_name password=$passwordパラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$schema_name:アクセスするスキーマ名。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
- データベースドライバーのクラス名を
その他の接続プールパラメータの設定
- 接続検証用のSQLステートメントとして
select 1 from dualを指定します。 - 接続プールの初期接続数を3に設定します。これは、接続プール起動時に3つの初期接続が作成されることを意味します。
- 接続プールの最大アクティブ接続数を30に設定します。これは、接続プール内に同時に存在できる接続数の上限が30であることを意味します。
- 無効な接続のログを出力するかどうかを
trueで指定します。これは、無効な接続が回収される際にエラーログに情報が出力されることを意味します。テスト環境ではtrueに設定し、本番環境ではパフォーマンスへの影響を避けるためにfalseに設定できます。 - 接続プールの最小アイドル接続数を5に設定します。これは、接続プール内のアイドル接続数が5未満になると、接続プールが自動的に新しい接続を作成することを意味します。
- 接続取得時の最大待機時間を1000ミリ秒に設定します。これは、接続プール内のすべての接続が使用中で、待機時間が1000ミリ秒を超えた場合、接続取得操作でタイムアウト例外がスローされることを意味します。
- アイドル状態の接続の最小保持時間を300000ミリ秒(5分)に設定します。これは、接続が300000ミリ秒間アイドル状態のままで使用されない場合、回収されることを意味します。
- 無効な接続を回収するかどうかを
trueで指定します。これは、接続がremoveAbandonedTimeoutで定義された時間を超えると回収されることを意味します。 - 無効な接続のタイムアウト時間を300秒に設定します。これは、300秒(5分)以上使用されない接続が回収されることを意味します。
- アイドル接続回収スレッドの実行間隔を10000ミリ秒に設定します。これは、10000ミリ秒(10秒)ごとにアイドル接続回収スレッドがアイドル接続の回収操作を実行することを意味します。
- 接続取得時に接続の可用性を検証するかどうかを
falseで指定します。falseに設定するとパフォーマンスが向上しますが、取得した接続が使用不能になる可能性もあります。 - 接続返却時に接続の可用性を検証するかどうかを
falseで指定します。falseに設定するとパフォーマンスが向上しますが、返却された接続が使用不能になる可能性もあります。 - アイドル状態の接続を検証するかどうかを
trueで指定します。trueに設定すると、接続プールは定期的にvalidationQueryを実行して接続の可用性を検証します。 - 長時間接続のハイビジビ機能を有効にするかどうかを
falseで指定します。falseに設定すると長時間接続のハイビジビは無効になります。 - 接続のアイドル時間しきい値を60000ミリ秒に設定します。これは、接続のアイドル時間が設定されたしきい値60000ミリ秒(1分)を超えると、接続の可用性を確保するために接続ハイビジビメカニズムがその接続を検出することを意味します。接続がしきい値時間内に何らかの操作を行うと、接続のアイドル時間は再計算されます。
コード:
validationQuery=select 1 from dual initialSize=3 maxActive=30 logAbandoned=true minIdle=5 maxWait=1000 minEvictableIdleTimeMillis=300000 removeAbandoned=true removeAbandonedTimeout=300 timeBetweenEvictionRunsMillis=10000 testOnBorrow=false testOnReturn=false testWhileIdle=true keepAlive=false keepAliveBetweenTimeMillis=60000- 接続検証用のSQLステートメントとして
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整および設定を行うことを推奨します。
Druid接続プールの一般的な設定パラメータ:
パラメータ |
説明 |
|---|---|
| url | データベースのURLを指定します。データベースの種類、ホスト名、ポート番号、データベース名などの情報が含まれます。 |
| username | データベースへの接続に必要なユーザー名を指定します。 |
| password | データベースへの接続に必要なパスワードを指定します。 |
| driverClassName | データベースドライバーのクラス名を指定します。driverClassName を明示的に設定しない場合、Druid接続プールは url からデータベースの種類 (dbType) を自動的に認識し、対応する driverClassName を選択します。この自動認識メカニズムにより、設定作業が軽減され、設定プロセスが簡素化されます。ただし、url が正しく解釈できない場合や、非標準のデータベースドライバークラスを使用する必要がある場合は、正しいドライバークラスがロードされるように、driverClassName パラメータを明示的に設定する必要があります。 |
| initialSize | 接続プールの初期化時に作成する接続数を指定します。アプリケーション起動時、接続プールは指定された数の接続を作成してプール内に格納します。 |
| maxActive | 接続プール内の最大アクティブ接続数を指定します。接続プールのアクティブ接続数が最大値に達すると、その後の接続要求は、接続が解放されるまで待機します。 |
| maxIdle | 接続プール内の最大アイドル接続数を指定します(このプロパティは非推奨です)。接続プールのアイドル接続数が最大値に達すると、余分な接続は閉じられます。 |
| minIdle | 接続プール内の最小アイドル接続数を指定します。接続プールのアイドル接続数が最小値を下回ると、接続プールは新しい接続を作成します。 |
| maxWait | 接続取得の最大待機時間を指定します。この時間を超えると例外がスローされます。正の数値に設定した場合、それは待機するミリ秒数を表し、その時間を超えると例外がスローされます。 |
| poolPreparedStatements | PreparedStatement のキャッシュ (PSCache) メカニズムを有効にするかどうかを指定します。true に設定すると、PreparedStatement オブジェクトがキャッシュされてパフォーマンスが向上します。ただし、OBProxyのメモリ使用量が継続的に増加する可能性があるため注意が必要です。このようなシナリオでは、メモリリークやメモリオーバーフローを避けるために、メモリ使用状況を適切に設定および監視する必要があります。 |
| validationQuery | 接続検証用のSQLクエリステートメントを指定します。接続が接続プールから取得される際、このクエリステートメントが実行され、接続が有効かどうか検証されます。 |
| timeBetweenEvictionRunsMillis | 接続プールがアイドル接続を検出する間隔時間をミリ秒単位で指定します。接続のアイドル時間が timeBetweenEvictionRunsMillis の設定値を超えると、接続は閉じられます。 |
| minEvictableIdleTimeMillis | 接続プール内の接続の最小アイドル時間をミリ秒単位で指定します。この時間を超えると接続は回収されます。負の数値に設定した場合、接続は回収されません。 |
| testWhileIdle | アイドル状態の接続をテストするかどうかを指定します。true に設定すると、接続がアイドル状態のときに validationQuery が実行され、接続が有効かどうか検証されます。 |
| testOnBorrow | 接続を取得する際に接続をテストするかどうかを指定します。true に設定すると、接続を取得する際に validationQuery が実行され、接続が有効かどうか検証されます。 |
| testOnReturn | 接続を返却する際に接続をテストするかどうかを指定します。true に設定すると、接続を返却する際に validationQuery が実行され、接続が有効かどうか検証されます。 |
| filters | 接続プール内で事前定義された一連のフィルターを指定します。これらのフィルターは、特定の順序で接続に対する事前処理および事後処理操作を行い、追加機能を提供し、接続プールのパフォーマンスを向上させることができます。一般的なフィルターには以下のものがあります:
filters プロパティに設定することで、接続プールは指定された順序でこれらのフィルターを順次適用します。複数のフィルター名はカンマで区切ることができます。例:filters=stat,wall,log4j。 |
Main.javaコードの紹介
Main.java ファイルは、本記事のサンプルプログラムのメインプログラムです。このサンプルを通じて、データソース、接続オブジェクト、およびさまざまなデータベース操作メソッドを使用してデータベースとやり取りする方法を理解できます。
本記事の Main.java ファイルのコードは、主に以下の部分で構成されています:
必要なクラスとインターフェースをインポートします。
- 現在のコードが属するパッケージ名を
com.exampleと宣言します。 - 入出力例外を処理するために、Javaの
IOExceptionクラスをインポートします。 - ファイルやその他のソースから入力ストリームを取得するために、Javaの
InputStreamクラスをインポートします。 - データベースへの接続を表すために、Javaの
Connectionインターフェースをインポートします。 - データベースクエリ結果のデータセットを表すために、Javaの
ResultSetインターフェースをインポートします。 - SQL例外を処理するために、Javaの
SQLExceptionクラスをインポートします。 - SQLステートメントを実行するために、Javaの
Statementインターフェースをインポートします。 - プリコンパイルされたSQLステートメントを使用するために、Javaの
PreparedStatementインターフェースをインポートします。 - プロパティファイルを処理するために、Javaの
Propertiesクラスをインポートします。 - データベース接続を管理するために、Javaの
DataSourceインターフェースをインポートします。 - Druidデータソースを作成するために、Alibaba Druid接続プールの
DruidDataSourceFactoryクラスをインポートします。
コード:
package com.example; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; import java.util.Properties; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory;- 現在のコードが属するパッケージ名を
Mainクラスを作成し、mainメソッドを定義します。Mainクラスとmainメソッドを定義します。mainメソッドは、接続プールを使用してデータベースから一連の操作を実行する方法を示すものです。具体的な手順は以下のとおりです:プログラムのエントリポイントとして、
Mainという名前のpublicクラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムのエントリポイントとして、コマンドライン引数を受け取るpublic staticメソッド
mainを定義します。例外処理メカニズムを使用して、発生する可能性のある例外をキャッチし、処理します。
loadPropertiesFileメソッドを呼び出して、プロパティファイルを読み込み、Propertiesオブジェクトを返します。プロパティファイルの設定に基づいてデータソースオブジェクトを作成するために、
createDataSource()メソッドを呼び出します。try-with-resourcesステートメントを使用して、データベース接続を取得し、接続の使用後に自動的に接続を閉じます。- テーブルを作成するために、
createTable()メソッドを呼び出します。 - データを挿入するために、
insertData()メソッドを呼び出します。 - データをクエリするために、
selectData()メソッドを呼び出します。 - データを更新するために、
updateData()メソッドを呼び出します。 - 更新されたデータを再度クエリするために、
selectData()メソッドを呼び出します。 - データを削除するために、
deleteData()メソッドを呼び出します。 - 削除後のデータを再度クエリするために、
selectData()メソッドを呼び出します。 - テーブルを削除するために、
dropTable()メソッドを呼び出します。
- テーブルを作成するために、
コード:
public class Main { public static void main(String[] args) { try { Properties properties = loadPropertiesFile(); DataSource dataSource = createDataSource(properties); try (Connection conn = dataSource.getConnection()) { // Create table createTable(conn); // Insert data insertData(conn); // Query data selectData(conn); // Update data updateData(conn); // Query the updated data selectData(conn); // Delete data deleteData(conn); // Query the data after deletion selectData(conn); // Drop table dropTable(conn); } } catch (Exception e) { e.printStackTrace(); } } // プロパティファイル内の設定情報を取得し、使用するためのメソッドを定義する // データソースオブジェクトを取得するためのメソッドを定義する // テーブルを作成するためのメソッドを定義する // データを挿入するためのメソッドを定義する // データを更新するためのメソッドを定義する // データを削除するためのメソッドを定義する // データをクエリするためのメソッドを定義する // テーブルを削除するためのメソッドを定義する }プロパティファイル内の設定情報を取得し、使用するためのメソッドを定義します。
プロパティファイルを読み込んで
Propertiesオブジェクトを返すためのプライベート静的メソッドloadPropertiesFile()を定義します。具体的な手順は以下のとおりです:- プロパティファイルから
Propertiesオブジェクトを返すプライベート静的メソッドloadPropertiesFile()を定義し、IOException例外がスローされる可能性があることを宣言します。 - プロパティファイル内のキーと値のペアを格納するための
Propertiesオブジェクトを作成します。 try-with-resourcesステートメントを使用して、クラスローダーからプロパティファイルdb.propertiesの入力ストリームisを取得します。loadメソッドを使用して、入力ストリームのプロパティをpropertiesオブジェクトにロードします。- ロード済みの
propertiesオブジェクトを返します。
コード:
private static Properties loadPropertiesFile() throws IOException { Properties properties = new Properties(); try (InputStream is = Main.class.getClassLoader().getResourceAsStream("db.properties")) { properties.load(is); } return properties; }- プロパティファイルから
データソースオブジェクトを取得するためのメソッドを定義します。
プロパティファイルの設定に基づいて
DataSourceオブジェクトを作成し、データベース接続の管理と取得に使用するためのプライベート静的メソッドcreateDataSource()を定義します。具体的な手順は以下のとおりです:- プロパティファイルの
Propertiesオブジェクトをパラメータとして受け取り、Exception例外がスローされる可能性があることを宣言するプライベート静的メソッドcreateDataSource()を定義します。 DruidDataSourceFactoryクラスのcreateDataSource()メソッドを呼び出し、プロパティpropertiesを渡してDataSourceオブジェクトを返します。
コード:
private static DataSource createDataSource(Properties properties) throws Exception { return DruidDataSourceFactory.createDataSource(properties); }- プロパティファイルの
テーブルを作成するためのメソッドを定義します。
データベースにデータテーブルを作成するためのプライベート静的メソッド
createTable()を定義します。具体的な手順は以下のとおりです:- データベースに
Connectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言するプライベート静的メソッドcreateTable()を定義します。 try-with-resourcesステートメントを使用して、接続オブジェクトconnのcreateStatement()メソッドを通じて、Statementオブジェクトstmtを作成します。- テーブル作成のSQLステートメントを格納する文字列変数
sqlを定義します。 executeUpdate()メソッドを使用してSQLステートメントを実行し、データテーブルを作成します。- テーブル作成成功のメッセージを出力します。
コード:
private static void createTable(Connection conn) throws SQLException { try (Statement stmt = conn.createStatement()) { String sql = "CREATE TABLE test_druid (id NUMBER, name VARCHAR2(20))"; stmt.executeUpdate(sql); System.out.println("Table created successfully."); } }- データベースに
データを挿入するためのメソッドを定義します。
データベースにデータを挿入するためのプライベート静的メソッド
insertData()を定義します。具体的な手順は以下のとおりです:データベースに
Connectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言するプライベート静的メソッドinsertData()を定義します。データ挿入のSQLステートメントを格納する文字列変数
insertDataSqlを定義します。データ挿入行数を記録するための整数型変数
insertedRowsを定義します。初期値は0です。try-with-resourcesステートメントを使用して、接続オブジェクトconnのprepareStatement()メソッドとデータ挿入のSQLステートメントを使用して、PreparedStatementオブジェクトinsertDataStmtを作成します。forループステートメントを使用して、5回繰り返します。これは5件のデータを挿入することを意味します。setInt()メソッドを使用して、最初のパラメータの値をループ変数iに設定します。setString()メソッドを使用して、2番目のパラメータの値を文字列test_insertにループ変数iの値を加算したものに設定します。executeUpdate()メソッドを使用してデータ挿入のSQLステートメントを実行し、戻り値としての操作行数をinsertedRows変数に累積します。
データ挿入成功のメッセージと、挿入された総行数を出力します。
挿入された総行数を返します。
コード:
private static int insertData(Connection conn) throws SQLException { String insertDataSql = "INSERT INTO test_druid (id, name) VALUES (?, ?)"; int insertedRows = 0; try (PreparedStatement insertDataStmt = conn.prepareStatement(insertDataSql)) { for (int i = 1; i < 6; i++) { insertDataStmt.setInt(1, i); insertDataStmt.setString(2, "test_insert" + i); insertedRows += insertDataStmt.executeUpdate(); } System.out.println("Data inserted successfully. Inserted rows: " + insertedRows); } return insertedRows; }データを更新するためのメソッドを定義します。
データベース内のデータを更新するためのプライベート静的メソッド
updateData()を定義します。具体的な手順は以下のとおりです:- データベース内のデータを更新するためのプライベート静的メソッド
updateData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言します。 try-with-resourcesステートメントを使用して、接続オブジェクトconnのprepareStatement()メソッドとデータ更新のSQLステートメントを使用して、PreparedStatementオブジェクトpstmtを作成します。setString()メソッドを使用して、最初のパラメータの値を文字列test_updateに設定します。setInt()メソッドを使用して、2番目のパラメータの値を整数値3に設定します。executeUpdate()メソッドを使用してデータ更新のSQLステートメントを実行し、戻り値としての操作行数をupdatedRows変数に代入します。- データ更新成功のメッセージと、更新された総行数を出力します。
コード:
private static void updateData(Connection conn) throws SQLException { try (PreparedStatement pstmt = conn.prepareStatement("UPDATE test_druid SET name = ? WHERE id = ?")) { pstmt.setString(1, "test_update"); pstmt.setInt(2, 3); int updatedRows = pstmt.executeUpdate(); System.out.println("Data updated successfully. Updated rows: " + updatedRows); } }- データベース内のデータを更新するためのプライベート静的メソッド
データを削除するためのメソッドを定義します。
データベース内のデータを削除するためのプライベート静的メソッド
deleteData()を定義します。具体的な手順は以下のとおりです:- データベース内のデータを削除するためのプライベート静的メソッド
deleteData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言します。 try-with-resourcesステートメントを使用して、接続オブジェクトconnのprepareStatement()メソッドとデータ削除のSQLステートメントを使用して、PreparedStatementオブジェクトpstmtを作成します。setInt()メソッドを使用して、最初のパラメータの値を整数値3に設定します。executeUpdate()メソッドを使用してデータ削除のSQLステートメントを実行し、戻り値としての操作行数をdeletedRows変数に代入します。- データ削除成功のメッセージと、削除された総行数を出力します。
コード:
private static void deleteData(Connection conn) throws SQLException { try (PreparedStatement pstmt = conn.prepareStatement("DELETE FROM test_druid WHERE id < ?")) { pstmt.setInt(1, 3); int deletedRows = pstmt.executeUpdate(); System.out.println("Data deleted successfully. Deleted rows: " + deletedRows); } }- データベース内のデータを削除するためのプライベート静的メソッド
データをクエリするためのメソッドを定義します。
データベースからデータをクエリするためのプライベート静的メソッド
selectData()を定義します。具体的な手順は以下のとおりです:データベースからデータをクエリするためのプライベート静的メソッド
selectData()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言します。try-with-resourcesステートメントを使用して、接続オブジェクトconnのcreateStatement()メソッドを通じて、Statementオブジェクトstmtを作成します。データクエリのSQLステートメントを格納する文字列変数
sqlを定義します。データクエリのSQLステートメントを実行するために
executeQuery()メソッドを使用し、戻り値としての結果セットをresultSet変数に代入します。whileループステートメントを使用して、結果セット内の各行データを走査します。getInt()メソッドを使用して、現在行のidフィールドの整数値を取得し、id変数に代入します。getString()メソッドを使用して、現在行のnameフィールドの文字列値を取得し、name変数に代入します。- 現在行の
idとnameフィールドの値を出力します。
コード:
private static void selectData(Connection conn) throws SQLException { try (Statement stmt = conn.createStatement()) { String sql = "SELECT * FROM test_druid"; ResultSet resultSet = stmt.executeQuery(sql); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); } } }テーブルを削除するためのメソッドを定義します。
データベースからテーブルを削除するためのプライベート静的メソッド
dropTable()を定義します。具体的な手順は以下のとおりです:- データベースからテーブルを削除するためのプライベート静的メソッド
dropTable()を定義します。このメソッドはConnectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言します。 try-with-resourcesステートメントを使用して、接続オブジェクトconnのcreateStatement()メソッドを通じて、Statementオブジェクトstmtを作成します。- テーブル削除のSQLステートメントを格納する文字列変数
sqlを定義します。 - テーブル削除のSQLステートメントを実行するために
executeUpdate()メソッドを使用します。 - テーブル削除成功のメッセージを出力します。
コード:
private static void dropTable(Connection conn) throws SQLException { try (Statement stmt = conn.createStatement()) { String sql = "DROP TABLE test_druid"; stmt.executeUpdate(sql); System.out.println("Table dropped successfully."); } }- データベースからテーブルを削除するためのプライベート静的メソッド
全コード表示
<?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.example</groupId>
<artifactId>druid-oceanbase-client</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>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
</project>
# Database Configuration
driverClassName=com.oceanbase.jdbc.Driver
url=jdbc:oceanbase://$host:$port/$schema_name
username=$user_name
password=$password
# Connection Pool Configuration
#To check whether the database link is valid, MySQL must be configured to select 1; Oracle is select 1 from dual
validationQuery=select 1 from dual
#Initial number of connections
initialSize=3
#Maximum number of activations, that is, the maximum number of Connection pool
maxActive=30
#When closing the Abandoned connection, the error log is output. When the link is recycled, the console prints information. The test environment can add true, while the online environment is false. Will affect performance.
logAbandoned=true
#Minimum number of activations during idle time
minIdle=5
#The maximum waiting time for a connection, in milliseconds
maxWait=1000
#The maximum time to start the eviction thread is the survival time of a link (previous value: 25200000, the converted result of this time is: 2520000/1000/60/60=7 hours)
minEvictableIdleTimeMillis=300000
#Whether to recycle after exceeding the time limit
removeAbandoned=true
#Exceeding the time limit (in seconds), currently 5 minutes. If any business processing time exceeds 5 minutes, it can be adjusted appropriately.
removeAbandonedTimeout=300
# Run the idle connection collector Destroy thread every 10 seconds to detect the interval time between connections, based on the judgment of testWhileIdle
timeBetweenEvictionRunsMillis=10000
#When obtaining a link, not verifying its availability can affect performance.
testOnBorrow=false
#Check whether the link is available when returning the link to the Connection pool.
testOnReturn=false
#This configuration can be set to true, without affecting performance and ensuring security. The meaning is: Detect when applying for a connection. If the idle time is greater than timeBetweenEviceRunsMillis, execute validationQuery to check if the connection is valid.
testWhileIdle=true
#Default false, if configured as true, connection detection will be performed in the DestroyConnectionThread thread (timeBetweenEvaluation once)
keepAlive=false
#If keepAlive rule takes effect and the idle time of the connection exceeds it, the connection will only be detected
keepAliveBetweenTimeMillis=60000
package com.example;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class Main {
public static void main(String[] args) {
try {
Properties properties = loadPropertiesFile();
DataSource dataSource = createDataSource(properties);
try (Connection conn = dataSource.getConnection()) {
// Create table
createTable(conn);
// Insert data
insertData(conn);
// Query data
selectData(conn);
// Update data
updateData(conn);
// Query the updated data
selectData(conn);
// Delete data
deleteData(conn);
// Query the data after deletion
selectData(conn);
// Drop table
dropTable(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static Properties loadPropertiesFile() throws IOException {
Properties properties = new Properties();
try (InputStream is = Main.class.getClassLoader().getResourceAsStream("db.properties")) {
properties.load(is);
}
return properties;
}
private static DataSource createDataSource(Properties properties) throws Exception {
return DruidDataSourceFactory.createDataSource(properties);
}
private static void createTable(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "CREATE TABLE test_druid (id NUMBER, name VARCHAR2(20))";
stmt.executeUpdate(sql);
System.out.println("Table created successfully.");
}
}
private static int insertData(Connection conn) throws SQLException {
String insertDataSql = "INSERT INTO test_druid (id, name) VALUES (?, ?)";
int insertedRows = 0;
try (PreparedStatement insertDataStmt = conn.prepareStatement(insertDataSql)) {
for (int i = 1; i < 6; i++) {
insertDataStmt.setInt(1, i);
insertDataStmt.setString(2, "test_insert" + i);
insertedRows += insertDataStmt.executeUpdate();
}
System.out.println("Data inserted successfully. Inserted rows: " + insertedRows);
}
return insertedRows;
}
private static void updateData(Connection conn) throws SQLException {
try (PreparedStatement pstmt = conn.prepareStatement("UPDATE test_druid SET name = ? WHERE id = ?")) {
pstmt.setString(1, "test_update");
pstmt.setInt(2, 3);
int updatedRows = pstmt.executeUpdate();
System.out.println("Data updated successfully. Updated rows: " + updatedRows);
}
}
private static void deleteData(Connection conn) throws SQLException {
try (PreparedStatement pstmt = conn.prepareStatement("DELETE FROM test_druid WHERE id < ?")) {
pstmt.setInt(1, 3);
int deletedRows = pstmt.executeUpdate();
System.out.println("Data deleted successfully. Deleted rows: " + deletedRows);
}
}
private static void selectData(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "SELECT * FROM test_druid";
ResultSet resultSet = stmt.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
}
}
private static void dropTable(Connection conn) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "DROP TABLE test_druid";
stmt.executeUpdate(sql);
System.out.println("Table dropped successfully.");
}
}
}
関連ドキュメント
OceanBase Connector/Jの詳細については、OceanBase JDBCドライバを参照してください。
druid-oceanbase-client サンプルプロジェクトをダウンロード