このトピックでは、Java Database Connectivity (JDBC) ドライバーを使用して、JavaアプリケーションをPolarDB for PostgreSQL (Compatible with Oracle) データベースに接続する方法について説明します。
前提条件
PolarDBクラスターにユーザーが作成されます。 ユーザーの作成方法については、「データベースアカウントの作成」をご参照ください。
PolarDBクラスターへのアクセスに使用するホストのIPアドレスが、クラスターのホワイトリストに追加されます。 クラスターのホワイトリストにIPアドレスを追加する方法については、「クラスターのホワイトリストの設定」をご参照ください。
背景情報
JDBCは、Javaアプリケーションをデータベースに接続するために使用されるJava APIです。 PolarDB for PostgreSQL (Compatible with Oracle) JDBCドライバは、オープンソースのPostgreSQL JDBCドライバに基づいて開発され、通信にPostgreSQLプロトコルを使用します。 JDBCドライバを使用すると、Javaアプリケーションは、標準でデータベースから独立したJavaコードを使用してデータベースに接続できます。
JDBCドライバは、PostgreSQLプロトコルのバージョン3.0を使用します。 JDBC V4.0はJava 6と互換性があります。 JDBC V4.1はJava 7と互換性があります。 JDBC V4.2はJava 8と互換性があります。
JDBCドライバのパッケージをダウンロードする
Alibaba Cloudは、JDBCドライバーの3つのバージョンを提供しています。 アプリケーションで使用されるJava Development Kit (JDK) バージョンに基づいてバージョンを選択します。 Java 6の場合は、polardb-jdbc16.jar
のJARファイルをダウンロードします。 Java 7の場合は、polardb-jdbc17.jar
のJARファイルをダウンロードします。 Java 8の場合は、polardb-jdbc18.jar
のJARファイルをダウンロードします。
JDBCドライバーの設定
JavaアプリケーションでJDBCドライバーを使用する前に、JDBCドライバーのパスをCLASSPATH
に追加します。 たとえば、JDBCドライバーのパスが /usr/local/polardb/share/java/ の場合、次のコマンドを実行してJDBCドライバーのパスをCLASSPATH
に追加します。
export CLASSPATH=$CLASSPATH:/usr/local/polardb/share/java/<Name of the JAR file.jar>
例:
export CLASSPATH=$CLASSPATH:/usr/local/polardb/share/java/polardb-jdbc18.jar
次のコマンドを実行して、現在のJDBCバージョンを表示します。
#java -jar <Name of the JAR file.jar>
例:
#java -jar polardb-jdbc18.jar
POLARDB JDBC Driver 42.2.XX.XX.0
PolarDB に接続する
例
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 DEMO * <p> * Please make sure the host ip running this demo is in you cluster's white list. */ public class PolarDBJdbcDemo { /** * Replace the following information. */ 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 prefix
jdbc:polardb://
URLのプレフィックス。 PolarDBクラスターURLのプレフィックスはすべて
jdbc:polardb://
です。エンドポイント
pc-*** .o.polardb.rds.aliyuncs.com
PolarDBクラスターのエンドポイント。 エンドポイントの表示方法については、「エンドポイントの表示または申請」をご参照ください。
ポート番号
1521
PolarDBクラスターのポート。 デフォルト値:1521
データベース
polardb_test
接続するデータベースの名前。
ユーザー名
テスト
PolarDBクラスターへの接続に使用されるユーザー名。
パスワード
Pw123456
PolarDBクラスターへの接続に使用されるユーザー名のパスワード。
クエリの実行とクエリ結果の処理
データベースでクエリを実行する前に、
Statement
、PreparedStatment
、またはCallableStatement
オブジェクトを作成する必要があります。上記の例では、
Statement
オブジェクトが作成されています。 次のサンプルコードでは、PreparedStatment
オブジェクトが作成されます。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); //Bind IN parameter first, then bind OUT parameter int id = 100; stmt.setInt(2, id); // This would set ID as 102 stmt.registerOutParameter(3, java.sql.Types.VARCHAR); stmt.registerOutParameter(4, java.sql.Types.INTEGER); //Use execute method to run stored procedure. stmt.execute(); //Retrieve name with getXXX method 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) エラーが発生する可能性があります。 OOMエラーを防ぐために、JDBCドライバはカーソルベースのResultSetオブジェクトを提供し、一度に複数のデータセットをフェッチするのに役立ちます。 ResultSetを使用するには、次のパラメーターを設定します。
FetchSize: デフォルト値は0です。 ResultSetを0に設定すると、すべてのデータがフェッチされます。
autoCommit: 値をfalseに設定します。
// make sure autocommit is off conn.setAutoCommit(false); Statement st = conn.createStatement(); // Set fetchSize to use cursor st.setFetchSize(50); ResultSet rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("a row was returned."); } rs.close(); // Reset fetchSize to turn off the cursor st.setFetchSize(0); rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("many rows were returned."); } rs.close(); // Close the statement. st.close();
Mavenを使用したJavaプロジェクトのセットアップ
JavaプロジェクトがMavenを使用してビルドされている場合は、次のコマンドを実行して、ローカルリポジトリにPolarDB JDBCドライバーをインストールします。
mvn install:install-file -DgroupId=com.aliyun -DartifactId=<Name of the JAR file> -Dversion=1.1.2 -Dpackaging=jar -Dfile=/usr/local/polardb/share/java/<Name of the JAR file.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.jar
プロジェクトのpom.xmlファイルに次の依存関係を追加し。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId><Name of the JAR file></artifactId>
<version>1.1.2</version>
</dependency>
例:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>polardb-jdbc18</artifactId>
<version>1.1.2</version>
</dependency>
冬眠
プロジェクトでHibernateを使用してデータベースに接続する場合は、Hibernate. cfg.xml
という名前のhibernate構成ファイルでPolarDBデータベースのドライバークラスと方言を構成します。
Hibernate 3.6以降のバージョンのみがPostgresPlusDialectをサポートしています。
<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 1.1.24以降はPolarDB JDBCドライバーをサポートしています。
ドライバー名
およびdbtype
パラメーターを設定する必要はありません。1.1.24より前のDruidバージョンでは、次の例に示すように、
ドライバー名
とdbtype
パラメーターを明示的に設定します。dataSource.setDriverClassName("com.aliyun.polardb.Driver"); dataSource.setDbType("postgresql");
説明1.1.24より前のDruidバージョンはPolarDBに適合していません。 したがって、
dbtype
をpostgresql
に設定する必要があります。
Druid接続プールでデータベースパスワードを暗号化する方法の詳細については、「データベースパスワード暗号化」をご参照ください。
Activitiに適応する
アプリケーションがビジネスプロセス管理 (BPM) にActivitiフレームワークを使用している場合、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"/>
<!-- Other configurations are omitted. -->
</bean>
クォーツに適応
Quartzは、ジョブをスケジュールするために使用されるオープンソースライブラリです。 Quartzを使用してPolarDBに接続する前に、次の例に示すように、org.quartz.jobStore.driverDelegateClass
をorg.quartz.impl.jdbcjobstore.PostgreSQLDelegate
に設定する必要があります。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
WebSphereに適応する
WebSphereを使用してPolarDBに接続する前に、次の手順を実行してJDBCドライバをデータソースとして構成する必要があります。
データベースタイプを [カスタム] に設定します。
実装クラスを
com.aliyun.polardb.ds.PGConnectionPoolDataSource
に設定します。クラスのパスをJDBCドライバのJARファイルのパスに設定します。
MyBatisに適応する
MyBatisを使用してPolarDBに接続する前に、databaseIdProviderファイルを設定する必要があります。 次のコードは、デフォルト設定を示しています。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
databaseIdProviderは、データベースサービスからdatabaseIdプロパティで指定された表示名へのマッピングを提供します。 このように、データベースサービスの名前がデータベースサービスのバージョンによって異なる場合でも、同じデータベースサービスが同じ表示名にマッピングされます。
databaseIdProviderはXMLファイルです。 このファイルでは、SQL文のdatabaseIdプロパティを指定できます。 これにより, databaseIdプロパティで指定されたデータベースでのみSQL文を実行できます。 この場合、MyBatisがXMLファイルをロードすると、現在のデータベースにマップされているSQL文と、databaseIdが指定されていないSQL文のみがロードされます。
SQL文のdatabaseIdプロパティを指定しない場合は、ファイルを変更する必要はありません。 databaseIdプロパティを使用して、PolarDBデータベースでのみ実行できるSQL文を識別するには、次の構成を追加し、XMLファイル内のSQL文に対してdatabaseIdプロパティをpolardbに設定します。
<property name="POLARDB" value="polardb" />
よくある質問
PolarDB for PostgreSQL (Oracleと互換) のJDBCドライバーの代わりに、オープンソースのJDBCドライバーを使用できますか?
PolarDB for PostgreSQL (Compatible with Oracle) は、オープンソースのPostgreSQLに基づいて開発され、複数の互換性機能を提供します。 これらの機能の一部を実装するにはドライバが必要です。 PolarDB for PostgreSQL (Oracleと互換) のJDBCドライバを使用することを推奨します。 PolarDB for PostgreSQL (Oracle互換) のJDBCドライバは、Alibaba Cloudの公式Webサイトからダウンロードできます。
パブリックMavenリポジトリでJDBCドライバーを使用できますか?
JDBCドライバのJARファイルは、Alibaba Cloudの公式Webサイトからのみダウンロードできます。 JARファイルをダウンロードした後、Mavenを使用してビルドされたプロジェクトのローカルリポジトリにJARファイルをインストールする必要があります。
JDBCドライバのバージョンを表示するにはどうすればよいですか。
java -jar <Driver name>
コマンドを実行して、バージョン番号を表示できます。URLに複数のIPアドレスとポート番号を指定できますか?
はい。PolarDB for PostgreSQL (Compatible with Oracle) のJDBCドライバを設定するときに、URLに複数のIPアドレスとポート番号を指定できます。 例:
jdbc:poalardb://1.2.XX.XX:5432,2.3.XX.XX:5432/postgres
説明URLで複数のIPアドレスを設定した後にアプリケーションをデータベースに接続する場合、システムは接続が確立されるまで順番にIPアドレスに接続しようとします。 すべてのIPアドレスを接続できない場合、接続は作成されません。 接続試行ごとのデフォルトのタイムアウト期間は10秒です。 タイムアウト期間を変更するには、URLにconnectTimeoutパラメーターを追加および設定します。
カーソルタイプを選択するにはどうすればよいですか?
使用するJavaバージョンが1.8より前の場合は、Types.REFを使用します。 それ以外の場合は、Types.REF_CURSORを使用します。
返された列名を自動的に大文字に変換するにはどうすればよいですか?
JDBCドライバのURLに
oracleCase=true
を追加します。 次に、返されるすべての列名は大文字です。 例:jdbc:poalardb://1.2.XX.XX:5432,2.3.XX.XX:5432/postgres?oracleCase=true