このトピックでは、Java Database Connectivity (JDBC) ドライバーを使用して Java アプリケーションを PolarDB for PostgreSQL (Oracle 互換) データベースに接続する方法について説明します。
前提条件
PolarDB クラスターにデータベースアカウントが作成されていること。詳細については、「データベースアカウントの作成」をご参照ください。
PolarDB クラスターへのアクセスに使用するホストの IP アドレスがホワイトリストに追加されていること。詳細については、「クラスターホワイトリストの設定」をご参照ください。
背景情報
Java Database Connectivity (JDBC) は、Java アプリケーションがデータベースにアクセスするために使用するプログラミングインターフェイスです。PolarDB for PostgreSQL (Oracle 互換) の JDBC ドライバーは、オープンソースの PostgreSQL JDBC ドライバーをベースにしています。PostgreSQL のネイティブネットワークプロトコルを使用して通信します。これにより、Java プログラムは標準的でデータベースに依存しない Java コードを使用してデータベースに接続できます。
JDBC ドライバーは PostgreSQL 3.0 プロトコルを使用し、Java 6 (JDBC 4.0)、Java 7 (JDBC 4.1)、および Java 8 (JDBC 4.2) と互換性があります。
JDBC ドライバーの設定
Java アプリケーションで JDBC ドライバーを使用する前に、JDBC ドライバーパッケージのパスを CLASSPATH に追加する必要があります。たとえば、JDBC ドライバーが /usr/local/polardb/share/java/ パスにある場合、次のコマンドを実行してドライバーパスを CLASSPATH に追加できます。
export CLASSPATH=$CLASSPATH:/usr/local/polardb/share/java/<jar_package_name.jar>例:
export CLASSPATH=$CLASSPATH:/usr/local/polardb/share/java/polardb-jdbc18.jar次のコマンドを実行して、現在の JDBC バージョンを表示します。
#java -jar <jar_package_name.jar>例:
#java -jar polardb-jdbc18.jar
POLARDB JDBC Driver 42.2.XX.XX.0PolarDB への接続
例
package com.aliyun.polardb; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * POLARDB JDBC デモ * <p> * このデモを実行するホストの IP がクラスターのホワイトリストに含まれていることを確認してください。 */ public class PolarDBJdbcDemo { /** * 次の情報を置き換えてください。 */ private final String host = "***.o.polardb.rds.aliyuncs.com"; private final String user = "***"; private final String password = "***"; private final String port = "1521"; private final String database = "db_name"; public void run() throws Exception { Connection connect = null; Statement statement = null; ResultSet resultSet = null; try { Class.forName("com.aliyun.polardb.Driver"); Properties props = new Properties(); props.put("user", user); props.put("password", password); String url = "jdbc:polardb://" + host + ":" + port + "/" + database; connect = DriverManager.getConnection(url, props); /** * create table foo(id int, name varchar(20)); */ String sql = "select id, name from foo"; statement = connect.createStatement(); resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println("id:" + resultSet.getInt(1)); System.out.println("name:" + resultSet.getString(2)); } } catch (Exception e) { e.printStackTrace(); throw e; } finally { try { if (resultSet != null) resultSet.close(); if (statement != null) statement.close(); if (connect != null) connect.close(); } catch (SQLException e) { e.printStackTrace(); throw e; } } } public static void main(String[] args) throws Exception { PolarDBJdbcDemo demo = new PolarDBJdbcDemo(); demo.run(); } }JDBC ドライバーのロード
アプリケーションで、次のコマンドを実行して JDBC ドライバーをロードします。
Class.forName("com.aliyun.polardb.Driver");データベースへの接続
JDBC では、データベースは通常 URL で表されます。以下に例を示します。
jdbc:polardb://pc-***.o.polardb.rds.aliyuncs.com:1521/polardb_test?user=test&password=Pw123456パラメーター
例
説明
URL プレフィックス
jdbc:polardb://PolarDB への接続に使用される URL のプレフィックスは
jdbc:polardb://です。エンドポイント
pc-***.o.polardb.rds.aliyuncs.comPolarDB クラスターのエンドポイント。詳細については、「エンドポイントの表示またはリクエスト」をご参照ください。
ポート
1521PolarDB クラスターのポート。デフォルトのポートは 1521 です。
データベース
polardb_test接続するデータベースの名前。
ユーザー名
testPolarDB クラスターのユーザー名。
パスワード
Pw123456PolarDB クラスターのユーザー名に対応するパスワード。
データのクエリと結果の処理
データベースにアクセスしてクエリを実行するときは、
Statement、PreparedStatement、またはCallableStatementオブジェクトを作成します。上記の例では
Statementオブジェクトを使用しています。次の例は、PreparedStatementオブジェクトの使用方法を示しています。PreparedStatement st = conn.prepareStatement("select id, name from foo where id > ?"); st.setInt(1, 10); resultSet = st.executeQuery(); while (resultSet.next()) { System.out.println("id:" + resultSet.getInt(1)); System.out.println("name:" + resultSet.getString(2)); }ストアドプロシージャを処理するには、
CallableStatementオブジェクトを使用できます。以下に例を示します。String sql = "{?=call getName (?, ?, ?)}"; CallableStatement stmt = conn.prepareCall(sql); stmt.registerOutParameter(1, java.sql.Types.INTEGER); // まず IN パラメーターをバインドし、次に OUT パラメーターをバインドします int id = 100; stmt.setInt(2, id); // これにより ID が 102 に設定されます stmt.registerOutParameter(3, java.sql.Types.VARCHAR); stmt.registerOutParameter(4, java.sql.Types.INTEGER); // execute メソッドを使用してストアドプロシージャを実行します。 stmt.execute(); // getXXX メソッドで名前を取得します String name = stmt.getString(3); Integer msgId = stmt.getInt(4); Integer result = stmt.getInt(1); System.out.println("Name with ID:" + id + " is " + name + ", and messegeID is " + msgId + ", and return is " + result);上記のコードで使用されている
getNameストアドプロシージャは次のとおりです。CREATE OR REPLACE FUNCTION getName( id In Integer, name Out Varchar2, result Out Integer ) Return Integer Is ret Int; Begin ret := 0; name := 'Test'; result := 1; Return(ret); End;説明ストアドプロシージャがカーソルを使用する場合、カーソルタイプは Java のバージョンによって異なります。
Java 8 以降の場合は、
Types.REF_CURSORタイプを使用します。Java 8 より前のバージョンの場合は、
Types.REFタイプを使用します。
FetchSize の設定
デフォルトでは、ドライバーはデータベースからすべてのデータを一度にフェッチします。大量のデータを含むクエリの場合、これによりクライアントのメモリが大量に消費され、メモリ不足 (OOM) エラーが発生する可能性があります。この問題を回避するために、JDBC はカーソルベースの ResultSet を提供して、データセットをバッチでフェッチします。この機能を使用するには:
FetchSize を設定します。デフォルトでは、FetchSize は 0 であり、これはドライバーがすべてのデータをフェッチすることを示します。
接続の autoCommit パラメーターを false に設定します。
// autoCommit がオフになっていることを確認します conn.setAutoCommit(false); Statement st = conn.createStatement(); // fetchSize を設定してカーソルを使用します st.setFetchSize(50); ResultSet rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("a row was returned."); } rs.close(); // fetchSize をリセットしてカーソルをオフにします st.setFetchSize(0); rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("many rows were returned."); } rs.close(); // ステートメントを閉じます。 st.close();
Maven プロジェクト
Java プロジェクトが Maven を使用してビルドされている場合は、次のコマンドを実行して、PolarDB JDBC ドライバーパッケージをローカルリポジトリにインストールします。
mvn install:install-file -DgroupId=com.aliyun -DartifactId=<jar_package_name> -Dversion=1.1.2 -Dpackaging=jar -Dfile=/usr/local/polardb/share/java/<jar_package_name.jar>例:
mvn install:install-file -DgroupId=com.aliyun -DartifactId=polardb-jdbc18 -Dversion=1.1.2 -Dpackaging=jar -Dfile=/usr/local/polardb/share/java/polardb-jdbc18.jarMaven プロジェクトの pom.xml ファイルに次の依存関係を追加します。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId><jar_package_name></artifactId>
<version>1.1.2</version>
</dependency>例:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>polardb-jdbc18</artifactId>
<version>1.1.2</version>
</dependency>Hibernate
プロジェクトで Hibernate を使用してデータベースに接続する場合は、hibernate.cfg.xml 構成ファイルで PolarDB データベースのドライバークラスとダイアレクトを設定します。
PostgresPlusDialect ダイアレクトをサポートするには、Hibernate 3.6 以降が必要です。
<property name="connection.driver_class">com.aliyun.polardb.Driver</property>
<property name="connection.url">jdbc:polardb://pc-***.o.polardb.rds.aliyuncs.com:1521/polardb_test</property>
<property name="dialect">org.hibernate.dialect.PostgresPlusDialect</property>Druid 接続プール
Druid 1.1.24 以降のバージョンは PolarDB ドライバーをネイティブにサポートしているため、
driver nameまたはdbtypeパラメーターを設定する必要はありません。1.1.24 より前のバージョンの Druid の場合は、次のように
driver nameとdbtypeパラメーターを明示的に設定する必要があります。dataSource.setDriverClassName("com.aliyun.polardb.Driver"); dataSource.setDbType("postgresql");説明1.1.24 より前のバージョンの Druid は PolarDB をネイティブにサポートしていません。そのため、
db-typeをpostgresqlに設定する必要があります。
Druid 接続プールでデータベースのパスワードを暗号化する方法については、「データベースパスワードの暗号化」をご参照ください。
Activiti への対応
アプリケーションで Activiti ビジネスプロセス管理 (BPM) フレームワークを使用している場合、PolarDB データソースを初期化するときに次のエラーメッセージが表示されることがあります。
couldn't deduct database type from database product name 'POLARDB Database Compatible with Oracle'このエラーは、Activiti にデータベースのバージョンとデータベースタイプの間のマッピングが組み込まれているために発生します。これにより、PolarDB のバージョン情報が正しくマッピングされません。この問題を解決するには、SpringProcessEngineConfiguration の子クラスを作成し、その子クラスで buildProcessEngine メソッドを再読み込みします。このソリューションでは、次の例に示すように、データベースタイプを明示的に指定する必要があります。
package com.aliyun.polardb;
import org.activiti.engine.ProcessEngine;
import org.activiti.spring.SpringProcessEngineConfiguration;
public class PolarDBSpringProcessEngineConfiguration extends SpringProcessEngineConfiguration {
public PolarDBSpringProcessEngineConfiguration() {
super();
}
@Override
public ProcessEngine buildProcessEngine() {
setDatabaseType(DATABASE_TYPE_POSTGRES);
return super.buildProcessEngine();
}
}プロジェクトに SpringProcessEngineConfiguration の子クラスを配置します。構成ファイルで、このクラスを使用して構成をロードし、エンジンを初期化するように指定します。次の例をご参照ください。
<bean id="processEngineConfiguration" class="com.aliyun.polardb.PolarDBSpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseSchemaUpdate" value="true"/>
<!-- その他の設定はここでは省略します。 -->
</bean>Quartz への対応
Quartz はオープンソースのジョブスケジューリングライブラリです。Quartz を使用して PolarDB に接続する場合は、org.quartz.jobStore.driverDelegateClass を org.quartz.impl.jdbcjobstore.PostgreSQLDelegate に設定する必要があります。以下に例を示します。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegateWebSphere への対応
WebSphere を使用する場合は、次のように PolarDB JDBC ドライバーをデータソースとして設定します。
データベースタイプを ユーザー定義 に設定します。
実装クラス名を
com.aliyun.polardb.ds.PGConnectionPoolDataSourceに設定します。クラスパスには、JDBC JAR パッケージへのパスを選択します。
MyBatis への対応
MyBatis を使用する場合、databaseIdProvider を設定する必要がある場合があります。デフォルトの構成は次のとおりです。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>databaseIdProvider の目的は、データベース製品名 を特定の名前 (databaseId) にマッピングすることです。これにより、バージョンアップ後にデータベース製品名が変更された場合でも、同じ名前にマッピングされることが保証されます。
MyBatis の XML マッピングファイルでは、SQL 文に databaseId 属性を指定できます。これにより、その databaseId に対応するデータベースでのみ SQL 文が実行されるようになります。MyBatis が XML マッピングファイルをロードするとき、現在のデータベースと一致する databaseId を持つ SQL 文のみをロードします。databaseId 属性を持たない SQL 文は常にロードされます。
したがって、XML マッピングファイル内のどの SQL 文にも databaseId が指定されていない場合は、デフォルトの構成を変更する必要はありません。databaseId を使用して PolarDB 固有の SQL 文を識別するには、次の構成を追加します。次に、XML マッピングファイル内の SQL 文の databaseId として polardb を使用します。
<property name="POLARDB" value="polardb" />よくある質問
Q:JDBC ドライバーはどのように選択すればよいですか? オープンソースのコミュニティドライバーを使用できますか?
A:PolarDB for PostgreSQL (Oracle 互換) はオープンソースの PostgreSQL をベースにしており、互換性のための多くの特徴が含まれています。これらの特徴の一部はドライバーレベルのサポートを必要とします。したがって、公式サイトからダウンロードできる公式の PolarDB JDBC ドライバーを使用することを推奨します。
Q:PolarDB JDBC ドライバーはパブリック Maven リポジトリで利用できますか?
A:サポートされている唯一の方法は、公式サイトから JDBC ドライバーパッケージをダウンロードすることです。Maven プロジェクトの場合は、このパッケージをローカルリポジトリに手動でインストールする必要があります。
Q:バージョン番号を確認するにはどうすればよいですか?
A:
java -jar driver_nameコマンドを実行してバージョン番号を確認します。Q:URL に複数の IP アドレスとポートを設定できますか?
A:はい、PolarDB for PostgreSQL (Oracle 互換) の JDBC ドライバーは、URL に複数の IP アドレスとポートを設定することをサポートしています。以下に例を示します。
jdbc:poalardb://1.2.XX.XX:5432,2.3.XX.XX:5432/postgres説明複数の IP アドレスを設定すると、ドライバーはこれらの IP アドレスを使用して順番に接続を試みます。いずれの IP アドレスでも接続を確立できない場合、接続試行は失敗します。各接続試行のデフォルトのタイムアウト期間は 10 秒です。この値は connectTimeout パラメーターによって制御されます。タイムアウト期間を変更するには、このパラメーターを接続文字列に追加します。
Q:カーソルタイプはどのように選択すればよいですか?
A:Java 1.8 より前の JDK バージョンを使用する場合は、Types.REF を使用します。Java 1.8 以降のバージョンを使用する場合は、Types.REF_CURSOR を使用できます。
Q:列名をデフォルトで大文字で返すことはできますか?
A:はい、できます。JDBC 接続文字列に
oracleCase=trueパラメーターを追加します。このパラメーターは、返される列名をデフォルトで大文字に変換します。以下に例を示します。jdbc:poalardb://1.2.XX.XX:5432,2.3.XX.XX:5432/postgres?oracleCase=true