本記事では、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:アクセス対象のスキーマ名。注意
テナントに接続するユーザーには、
CREATE SESSION権限と、該当するスキーマに対する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と指定します。
説明
このセクションのコードは、プロジェクトが依存するコンポーネントがOceanBase Connector/JのV2.4.2バージョンであることを定義しています。他のバージョンの情報については、OceanBase JDBCドライバーを参照してください。
コード:
<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と指定します。
コード:
<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と指定します。 - ホストIPアドレス、ポート番号、アクセスするSchemaを含むデータベース接続のURLを指定します。
- データベースのユーザー名を指定します。
- データベースのパスワードを指定します。
コード:
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:アクセスするSchemaの名前です。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
- データベースドライバープログラムのクラス名を
他の接続プールのパラメータを設定します。
- 接続検証用のSQLステートメント
select 1 from dualを指定します。 - 接続プールの初期接続数を3に指定します。これは、接続プール起動時に3つの初期接続が作成されることを意味します。
- 接続プールの最大アクティブ接続数を30に指定します。これは、接続プール内に同時に最大30個の接続が存在できることを意味します。
- 廃棄された接続のログ出力を
trueに指定します。これは、廃棄された接続を回収する際、エラーログに出力されるようにすることを意味します。テスト環境ではtrueに設定し、本番環境ではfalseに設定することで、パフォーマンスへの影響を回避できます。 - 接続プールの最小アイドル接続数を5に指定します。これは、接続プール内のアイドル接続数が5未満の場合、接続プールが自動的に新しい接続を作成することを意味します。
- 接続取得時の最大待機時間を1000に指定します。単位はミリ秒です。これは、接続プール内の接続がすべて使用されている場合、かつ待機時間が1000ミリ秒を超えた場合、接続取得操作でタイムアウト例外がスローされることを意味します。
- 接続がアイドル状態にあるときの最小保持時間を300000に指定します。単位はミリ秒です。これは、接続が300000ミリ秒(5分)アイドル状態で使用されない場合、回収されることを意味します。
- 廃棄された接続の回収を
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)機構を有効にするかどうかを指定します(poolPreparedStatements)。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インターフェースをインポートし、データベースクエリ結果のデータセットを表すために使用します。 - Java の
SQLExceptionクラスをインポートし、SQL 例外を処理するために使用します。 - Java の
Statementインターフェースをインポートし、SQL ステートメントを実行するために使用します。 - Java の
PreparedStatementインターフェースをインポートし、プリコンパイルされた SQL ステートメントを処理するために使用します。 - Java の
Propertiesクラスをインポートし、プロパティファイルを処理するために使用します。 - Java の
DataSourceインターフェースをインポートし、データベース接続を管理するために使用します。 - Alibaba Druid 接続プールの
DruidDataSourceFactoryクラスをインポートし、Druid データソースを作成するために使用します。
コード:
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という名前のパブリッククラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムのエントリポイントとして、パブリック静的メソッド
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(); } } // プロパティファイル内の設定情報を取得および使用するためのメソッドを定義します // データソースオブジェクトを取得するためのメソッドを定義します // テーブルを作成するためのメソッドを定義します // データを挿入するためのメソッドを定義します // データを更新するためのメソッドを定義します // データを削除するためのメソッドを定義します // データをクエリするためのメソッドを定義します // テーブルを削除するためのメソッドを定義します }プロパティファイル内の設定情報を取得および使用するためのメソッドを定義します。
プライベート静的メソッド
loadPropertiesFile()を定義し、プロパティファイルをロードしてPropertiesオブジェクトを返します。具体的な手順は以下のとおりです:- プライベート静的メソッド
loadPropertiesFile()を定義し、Propertiesオブジェクトを返し、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; }- プライベート静的メソッド
データソースオブジェクトを取得するためのメソッドを定義します。
プライベート静的メソッド
createDataSource()を定義し、プロパティファイル内の設定に基づいてDataSourceオブジェクトを作成します。データベース接続を管理および取得するために使用します。具体的な手順は以下のとおりです:- プライベート静的メソッド
createDataSource()を定義し、Propertiesオブジェクトをパラメータとして受け取り、Exception例外がスローされる可能性があることを宣言します。 DruidDataSourceFactoryクラスのcreateDataSource()メソッドを呼び出し、プロパティpropertiesを渡して、DataSourceオブジェクトを返します。
コード:
private static DataSource createDataSource(Properties properties) throws Exception { return DruidDataSourceFactory.createDataSource(properties); }- プライベート静的メソッド
テーブルを作成するためのメソッドを定義します。
プライベート静的メソッド
createTable()を定義し、データベース内にデータテーブルを作成します。具体的な手順は以下のとおりです:- プライベート静的メソッド
createTable()を定義し、Connectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言します。 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()を定義し、データベースにデータを挿入します。具体的な手順は以下のとおりです:プライベート静的メソッド
insertData()を定義し、Connectionオブジェクトをパラメータとして受け取り、SQLException例外がスローされる可能性があることを宣言します。文字列変数
insertDataSqlを定義し、データ挿入の SQL ステートメントを格納します。整数変数
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 ステートメントを格納します。executeQuery()メソッドを使用してデータクエリの SQL ステートメントを実行し、戻り値の結果セットを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 ステートメントを格納します。 executeUpdate()メソッドを使用してテーブル削除の SQL ステートメントを実行します。- テーブル削除に成功したというメッセージを出力します。
コード:
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>
db.properties
# 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サンプルプロジェクトをダウンロード
Druid接続プールによるOceanBaseデータベースへの接続のサンプルプログラム(Oracleモード)