すべてのプロダクト
Search
ドキュメントセンター

PolarDB:JDBC

最終更新日:Nov 09, 2025

このトピックでは、Java Database Connectivity (JDBC) を使用して Java アプリケーション内で PolarDB for PostgreSQL (Oracle 互換) データベースに接続する方法について説明します。

前提条件

  • PolarDB for PostgreSQL (Oracle 互換) 2.0 を使用する必要があります。

  • PolarDB クラスターでデータベースアカウントを作成する必要があります。詳細については、「データベースアカウントの作成」をご参照ください。

  • PolarDB クラスターへのアクセスに使用するホストの IP アドレスをホワイトリストに追加する必要があります。詳細については、「クラスターのホワイトリストを設定する」をご参照ください。

背景情報

Java Database Connectivity (JDBC) は、Java アプリケーションがデータベースにアクセスするためのプログラミングインターフェイスを提供します。PolarDB for PostgreSQL (Oracle 互換) の JDBC ドライバーは、オープンソースの PostgreSQL JDBC ドライバーに基づいて開発されています。ネイティブの PostgreSQL ネットワークプロトコルを使用しており、Java プログラムは標準的でデータベースに依存しない Java コードを使用してデータベースに接続できます。

ドライバーのダウンロード

JDK バージョン

パッケージ

1.6

PolarDB-JDBC-42.2.13.0.11.jre6.jar

1.7

PolarDB-JDBC-42.2.13.0.11.jre7.jar

1.8

PolarDB-JDBC-42.5.4.0.12.jre8.jar

説明

セキュリティ上の理由から、Oracle 構文互換 1.0 と互換性のあるドライバーは削除されました。サポートが必要な場合は、お問い合わせください

Maven 構成

PolarDB JDBC ドライバーは、まだ公開 Maven リポジトリでは利用できません。JAR パッケージをローカルリポジトリにアップロードして設定できます。

機能紹介

接続レベルのパラメーター機能

以下の機能は、接続パラメーターを使用して設定されます。サポートされているパラメーターを次の表に示します。すべての新しいパラメーターは接続レベルで有効であり、接続のライフサイクルに従います。

パラメーター

説明

autoCommit

パラメーターの自動コミットを有効または無効にします。有効な値:

  • true (デフォルト): 自動コミットを有効にします。

  • false: 自動コミットを無効にします。

autoCommitSpecCompliant

自動コミットが有効な場合に commit/rollback メソッドの呼び出しを許可するかどうかを指定します。有効な値:

  • true (デフォルト): 呼び出しを許可します。

  • false: 呼び出しを許可しません。

blobAsBytea

Oracle 互換の BLOB をサポートするかどうかを指定します。有効な値:

  • true (デフォルト): Oracle 互換の BLOB をサポートします。

  • false: Oracle 互換の BLOB をサポートしません。

clobAsText

Oracle 互換の CLOB をサポートするかどうかを指定します。有効な値:

  • true (デフォルト): Oracle 互換の CLOB をサポートします。

  • false: Oracle 互換の CLOB をサポートしません。

collectWarning

メモリオーバーフローを防ぐために警告を収集するかどうかを指定します。有効な値:

  • true (デフォルト): 警告を収集します。

  • false: 警告を収集しません。

defaultPolarMaxFetchSize

MaxFetchSize と連携して、結果セットの行数を制御します。デフォルト値は 0 です。

extraFloatDigits

小数部の長さ。

mapDateToTimestamp

Date 型から Timestamp への変換をサポートするかどうかを指定します。有効な値:

  • true (デフォルト): 変換をサポートします。

  • false: 変換をサポートしません。

namedParam

:xxx を使用したパラメーターバインディングをサポートするかどうかを指定します。有効な値:

  • true: :xxx を使用したパラメーターバインディングをサポートします。

  • false (デフォルト): :xxx を使用したパラメーターバインディングをサポートしません。

oracleCase

列名とテーブル名を大文字で返すかどうかを指定します。有効な値:

  • false (デフォルト): 返される列名とテーブル名の大文字と小文字を変換しません

  • true: 返されるすべての列名とテーブル名を大文字に変換します

  • strict: 返される列名とテーブル名がすべて小文字の場合にのみ大文字に変換します

resetNlsFormat

デフォルトで date/timestamp/timestamptz 型を標準形式で解析するかどうかを指定します。有効な値:

  • true (デフォルト): デフォルトで標準形式に基づいて date/timestamp/timestamptz 型の検出をサポートします。

  • false: デフォルトで標準形式に基づいて date/timestamp/timestamptz 型を検出しません。

boolAsInt

ブール値に対する Oracle のセマンティクスをサポートします。有効な値:

  • true: ブール値を 1/0 で表します。

  • false (デフォルト): ブール値を true/false で表します。

データ型の解析

  • Date 型: 64 ビットの Date 型をサポートします。

    カーネルは、Oracle と同じデータ形式の 64 ビット Date 型をサポートしており、これには時、分、秒の情報が含まれます。ドライバーはこの Date 型を Timestamp として処理できます。すべての Date 型 (Types.DATE または DATEOID) を Timestamp 型にマッピングし、それに応じて処理します。

  • Interval 型: Oracle モードでの Interval 入力をサポートします。

    コミュニティの PostgreSQL ドライバーは、+12 12:03:12.111 のような Interval 入力をサポートしていません。PolarDB for PostgreSQL (Oracle 互換) は、Oracle モードでの標準出力であるため、この出力形式をサポートしています。

  • Number 型: Number 型の値の取得をサポートします。

    標準の java.sql 実装には getNumber 関連の関数がありません。getInt などの関数のみがあります。関数のパラメーターが Number 型の場合、getInt、setInt、RegisterParam などのインターフェイスを使用して、パラメーターを Int として渡すことができます。

  • BLOB 型: BLOB は Bytea として処理され、CLOB は Text として処理されます。

    この機能は java.sql.Blob および java.sql.Clob インターフェイスを実装します。カーネルは BLOB と CLOB のマッピングを追加したため、Java レイヤーで Bytea と Text として処理できます。メインクラスは getBytes、setBytes、position、getBinaryStream などのメソッドを実装します。

  • Boolean 型: Boolean 型を 1/0 に変換することをサポートします。

    下位互換性のために、setBoolean インターフェイスメソッドはデフォルトで true/false を使用します。ただし、Oracle 互換のデータベース対話の要件を満たすために、boolAsInt パラメーターを有効にすることで、Oracle 互換の 1/0 セマンティクスに切り替えることができます。

    説明

    数値型をブール型に変換するルールは、ドライバーパッケージのバージョンによって異なります。

    • バージョン 42.5.4.0.10 以前: 数値 1 は True として扱われます。数値 0 は False として扱われます。その他の数値はエラーを返します。

    • バージョン 42.5.4.0.11 以降: 数値 0 は False として扱われます。その他すべてのゼロ以外の数値は True として扱われます。この動作は Oracle ドライバーと一致します。

PL/SQL の適応

  • $$ 記号なしのストアドプロシージャをサポートします。

    この機能は、FUNCTIONPROCEDURE などのプロシージャを作成する際に $$ 記号を省略することをサポートし、構文解析中に / 文字を切り捨てます。

  • コロンで始まる変数名をパラメーターとしてサポートします。

    パラメーターを :xxx 形式で渡すことをサポートします。ここで、xxx はコロンで始まる変数名です。

  • 匿名ブロックでのパラメーターバインディングをサポートします。

  • PL/SQL の警告メッセージの抑制をサポートします。

    この機能は、過剰な警告情報がループ内に保存され、メモリが超過するのを防ぎます。

JDBC ドライバーを読み込む

アプリケーションで、次のコマンドを実行して JDBC ドライバーをロードできます。

Class.forName("com.aliyun.polardb2.Driver");
説明

JDBC をプロジェクトにインポートすると、ドライバーは自動的に登録されます。追加の登録は必要ありません。

データベースへの接続

jdbc:polardb プロトコル

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.com

PolarDB クラスターのエンドポイント。詳細については、「エンドポイントの表示またはリクエスト」をご参照ください。

ポート

1521

PolarDB クラスターのポート。デフォルトのポートは 1521 です。

データベース

polardb_test

接続するデータベースの名前。

ユーザー名

test

PolarDB クラスターのユーザー名。

パスワード

Pw123456

PolarDB クラスターのユーザー名のパスワード。

jdbc:postgresql プロトコル

jdbc:postgresql:// プロトコルを使用してクラスターに接続できます。ただし、ネイティブの PostgreSQL ドライバーとの競合による他の接続例外を避けるために、接続文字列の末尾に forceDriverType=true パラメーターを追加して、このプロトコルを明示的に有効にする必要があります。以下に使用方法の例を示します。

jdbc:postgresql://pc-***.o.polardb.rds.aliyuncs.com:1521/postgres?forceDriverType=True

パラメーター

説明

URL プレフィックス

jdbc:postgresql://

PolarDB に接続するための URL です。jdbc:postgresql:// をプレフィックスとして使用します。

エンドポイント

pc-***.o.polardb.rds.aliyuncs.com

PolarDB クラスターのエンドポイント。詳細については、「エンドポイントの表示またはリクエスト」をご参照ください。

ポート

1521

PolarDB クラスターのポート。デフォルトのポートは 1521 です。

クエリと結果の処理

データベースにアクセスしてクエリを実行する場合、StatementPreparedStatement、または CallableStatement オブジェクトを作成する必要があります。

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));
}

関数またはストアドプロシージャの呼び出し

JDBC の CallableStatement オブジェクトを使用して、関数やプロシージャを呼び出すことができます。

説明

PolarDB for PostgreSQL (Oracle 互換) は、CALL 関数の構文ロジックをアップグレードし、より広範な JDBC パラメーターバインディングメソッドをサポートするようになりました。開始する前に、最新バージョンの JDBC ドライバーパッケージを使用していることを確認してください。

パラメーターの説明

パラメーター型

JDBC 登録メソッド

Java 設定メソッド

Java 取得メソッド

IN

不要

setXXX(index, value)

取得不可

IN OUT

registerOutParameter(index, type)

setXXX(index, value)

getXXX(index)

OUT

registerOutParameter(index, type)

不要

getXXX(index)

ストアドプロシージャ呼び出しの例

クラスタに test_in_out_procedure ストアドプロシージャを作成します。

CREATE OR REPLACE PROCEDURE test_in_out_procedure (a IN number, b IN OUT number, c OUT number) IS
BEGIN
    b := a + b;
    c := b + 1;
END;

Java では、CallableStatement オブジェクトを作成して test_in_out_procedure ストアドプロシージャを呼び出すことができます。

CallableStatement cstmt = connection.prepareCall("{call test_in_out_procedure(?, ?, ?)}");

// IN パラメーター a
cstmt.setInt(1, 1);

// IN OUT パラメーター b
cstmt.setInt(2, 2);
cstmt.registerOutParameter(2, Types.INTEGER);

// OUT パラメーター c
cstmt.registerOutParameter(3, Types.INTEGER);

cstmt.execute();

int b = cstmt.getInt(2);
int c = cstmt.getInt(3);

関数呼び出しの例

クラスタに test_in_out_function 関数を作成します。

CREATE OR REPLACE FUNCTION test_in_out_function (a IN number, b IN OUT number, c OUT number) RETURN number AS
BEGIN
    b := a + b;
    c := b + 1;
    RETURN c + 1;
END;

Java は 2 つの呼び出しメソッドをサポートしています。

  • JDBC エスケープ構文を使用する:

    CallableStatement cstmt = connection.prepareCall("{?= call test_in_out_function(?, ?, ?)}");
    
    // 戻り値 r
    cstmt.registerOutParameter(1, Types.INTEGER);
    
    // IN パラメーター a
    cstmt.setInt(2, 1);
    
    // IN OUT パラメーター b
    cstmt.setInt(3, 2);
    cstmt.registerOutParameter(3, Types.INTEGER);
    
    // OUT パラメーター c
    cstmt.registerOutParameter(4, Types.INTEGER);
    
    cstmt.execute();
    
    int r = cstmt.getInt(1);
    int b = cstmt.getInt(3);
    int c = cstmt.getInt(4);
  • BEGIN ... END; 匿名ブロックラッパーを使用する:

    CallableStatement cstmt = connection.prepareCall("BEGIN ? := test_in_out_function(?, ?, ?); END;");
    
    // 戻り値 r
    cstmt.registerOutParameter(1, Types.INTEGER);
    
    // IN パラメーター a
    cstmt.setInt(2, 1);
    
    // IN OUT パラメーター b
    cstmt.setInt(3, 2);
    cstmt.registerOutParameter(3, Types.INTEGER);
    
    // OUT パラメーター c
    cstmt.registerOutParameter(4, Types.INTEGER);
    
    cstmt.execute();

関数をストアドプロシージャとして呼び出す

クラスターに test_in_out_function_as_procedure_1 ストアドプロシージャを作成します。このプロシージャでは、test_in_out_function 関数が直接呼び出され、OUT パラメーターに値が割り当てられます。

CREATE OR REPLACE PROCEDURE test_in_out_function_as_procedure_1 (
    a IN number,
    b IN OUT number,
    c OUT number,
    r OUT number
) AS
BEGIN
    r := test_in_out_function(a, b, c);
END;
CallableStatement cstmt = connection.prepareCall("{call test_in_out_function_as_procedure_1(?, ?, ?, ?)}");

cstmt.setInt(1, 1); // a
cstmt.setInt(2, 2); // b
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.INTEGER); // c
cstmt.registerOutParameter(4, Types.INTEGER); // r

cstmt.execute();

int b = cstmt.getInt(2);
int c = cstmt.getInt(3);
int r = cstmt.getInt(4);

SELECT INTO を使用して関数を呼び出す

クラスタに test_in_out_function_as_procedure_2 ストアドプロシージャを作成します。このプロシージャでは、SELECT INTO を使用して test_in_out_function 関数が呼び出されます。

CREATE OR REPLACE PROCEDURE test_in_out_function_as_procedure_2 (
    a IN number,
    b IN OUT number,
    c OUT number,
    r OUT number
) AS
BEGIN
    SELECT test_in_out_function(a, b, c) INTO r FROM dual;
END;
CallableStatement cstmt = connection.prepareCall("{call test_in_out_function_as_procedure_2(?, ?, ?, ?)}");

cstmt.setInt(1, 1); // a
cstmt.setInt(2, 2); // b
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.INTEGER); // c
cstmt.registerOutParameter(4, Types.INTEGER); // r

cstmt.execute();

パラメーターとして構造体を使用する

バージョン 42.5.4.0.12 (2025-08-13) 以降、データベースドライバーは createStruct 構文をサポートします。関数の入力パラメーターとして Struct を使用できます。これにより、Java コードでデータベースからカスタム複合型 (オブジェクト型とも呼ばれる) を簡単に構築して渡すことができます。

// conn は確立されたデータベース接続オブジェクトであると仮定します
public void testSelectBoolean1() throws Exception {
  // 1. 構造体の属性配列を準備します。
  // 配列要素の順序と型は、データベースで定義された test_object 型と厳密に一致する必要があります。
  Object[] addressAttributes = new Object[] {
      Integer.valueOf(42),                     // 整数
      new BigDecimal("9999.99"),               // java.math.BigDecimal
      Boolean.TRUE,                            // ブール値
      new Date(),                              // java.util.Date
      new Timestamp(System.currentTimeMillis()), // java.sql.Timestamp
      "This is a test string",                 // 文字列
      new StringBuilder("mutable string"),     // StringBuilder
      null,                                    // null
  };
  
  // 2. conn.createStruct を使用して Struct オブジェクトを作成します
  Struct addressStruct = conn.createStruct("test_object", addressAttributes);
  
   // 3. CallableStatement を準備して実行し、関数を呼び出します
  CallableStatement stmt = conn.prepareCall("{? = call test_object_func(?)}");
  stmt.registerOutParameter(1, Types.VARCHAR);
  stmt.setObject(2, addressStruct);
  stmt.execute();
  
  // 4. 関数の戻り値を取得して出力します
  System.out.println(stmt.getObject(1).toString());
  
  stmt.close();
}

関連ツールの適応

Hibernate への適用

  • hibernate.cfg.xml ドライバークラスとダイアレクトの設定: プロジェクトで Hibernate を使用してデータベースに接続する場合、hibernate.cfg.xml Hibernate 設定ファイルで PolarDB データベースのドライバークラスとダイアレクトを設定する必要があります。

    説明

    PostgresPlusDialect ダイアレクトをサポートするには、Hibernate のバージョンが 3.6 以降である必要があります。

    <property name="connection.driver_class">com.aliyun.polardb2.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>
  • DATE 型の設定: テーブルの DATE 型の列については、Hibernate の .hbm.xml ファイルで設定を type="java.util.Date" に調整する必要があります。これにより、Hibernate が PolarDBDATE 型データを読み書きする際に、時、分、秒の精度を維持することが保証されます。type="date" を直接使用すると、DATE 型の精度が失われる可能性があります。以下は設定例です。

    <!-- その他の設定情報 -->
    <hibernate-mapping package="com.aliyun.polardb2.demo">
        <class name="TestTableEntity" table="test_table_name">
            <!-- その他の列情報 -->
            <property name="currentDate" column="curr_date" type="java.util.Date"/> <!-- 日付の精度を維持するために java.util.Date 型を指定します -->
            <!-- その他の列情報 -->
        </class>
    </hibernate-mapping>
  • LOB (Large Object) 型の設定: ネイティブの PostgreSQL は LOB 型をサポートしていません。そのため、PostgresPlusDialect ダイアレクトは CLOB と BLOB の両方の型列を oid 型列にマッピングします。これにより、これらの列に挿入された文字列が oid 番号に変換されます。PolarDB for PostgreSQL (Oracle 互換) 2.0 は、CLOB 型を text 型に、BLOB 型を bytea 型にマッピングします。これを有効にするには、列の型を指定する必要があります。以下の 2 つの設定のいずれかを選択できます。

    • 設定 1: Java クラス定義。

      @Lob
      @Column(name = "col_clob")
      @Type(type = "text")
      private String columnClob;
      
      @Lob
      @Column(name = "col_blob")
      @Type(type = "bytea")
      private String columnBlob;
    • 設定 2: Hibernate .hbm.xml ファイルでの定義。

      <!-- その他の設定情報 -->
      <hibernate-mapping package="com.aliyun.polardb2.demo">
          <class name="TestTableEntity" table="test_table_name">
              <!-- その他の列情報 -->
              <property name="columnClob" column="col_clob" type="text"/>
              <property name="columnBlob" column="col_blob" type="bytea"/>
              <!-- その他の列情報 -->
          </class>
      </hibernate-mapping>

Druid 接続プール

Druid は、アプリケーションと PolarDB for PostgreSQL (Oracle 互換) との間の接続を管理するために使用できるデータベース接続プールです。Druid を接続に使用する場合、完全な機能と安定性を確保するために、以下の主要な設定に注意してください。

  1. Druid はバージョン 1.2.26PolarDB のサポートを開始しました。プロジェクトで参照されているバージョンがこのバージョン以降であることを確認してください。以下は Maven の例です。

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.26</version>
    </dependency>
  2. 接続プールを初期化する際には、driverClassNamedbType を明示的に設定する必要があります。

    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName("com.aliyun.polardb2.Driver");
    dataSource.setDbType("polardb2");
  3. SQL ファイアウォール (WallFilter) を使用して、ビジネス SQL が Oracle 構文仕様に準拠しているかを厳密にチェックし、SQL インジェクションの脅威を防ぐことができます。まず、WallConfig を設定し、setStrictSyntaxCheck(true) を設定します。また、複数ステートメントの不許可、コメントの許可、SELECT INTO の許可、条件なしの DELETE ステートメントのチェックなど、オプションの設定も構成できます。次に、WallConfig オブジェクトを使用して WallFilter を設定します。最後に、WallFilter を DruidDataSource のプロキシフィルターに追加します。

    // 1. WallConfig を設定します。
    WallConfig wallConfig = new WallConfig();
    
    // 1.1 厳密な構文チェックを実行するかどうかを指定します。このパラメーターは必須です。
    wallConfig.setStrictSyntaxCheck(true);
    
    // 1.2 詳細な構文制御を設定します。一部のオプションのみがリストされています。このパラメーターはオプションです。
    wallConfig.setMultiStatementAllow(false);    // 一度に複数のステートメントの実行を許可するかどうかを指定します。
    wallConfig.setCommentAllow(true);            // コメントを許可します。
    wallConfig.setSelectIntoAllow(true);         // SELECT INTO ステートメントを許可します。
    wallConfig.setDeleteWhereNoneCheck(true);    // WHERE 句のない DELETE ステートメントをチェックします。
    
    // 2. WallConfig を使用して WallFilter を設定します。
    WallFilter wallFilter = new WallFilter();
    wallFilter.setConfig(wallConfig);
    
    // 3. WallFilter を使用して接続プールを設定します。
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.getProxyFilters().add(wallFilter);
  4. Druid 接続プールでデータベースのパスワードを暗号化するには、「データベースパスワードの暗号化」をご参照ください。

WebSphere への適用

WebSphere を使用する場合、以下の手順で PolarDB JDBC をデータソースとして設定できます。

  1. データベースタイプには、[ユーザー定義] を選択します。

  2. 実装クラス名を com.aliyun.polardb2.ds.PGConnectionPoolDataSource に設定します。

  3. クラスパスには、JDBC JAR パッケージが配置されているパスを選択します。

Spring フレームワークへの適応

Spring フレームワークで新しいバージョンの JDBC ドライバー (バージョン 42.5.4.0.11 以降) を使用する場合、追加のコード変更なしで構造体型をストアドプロシージャのパラメーターとして直接渡すことができます。次の例は、GetUserProcedure メソッドを使用して get_user_info ストアドプロシージャを呼び出す方法を示しています。パラメーター ccom という名前の複合型です。複合型パラメーターは、対応する構造体オブジェクトを構築することによって渡されます。

public class GetUserProcedure extends StoredProcedure {
    private static final String PROCEDURE_NAME = "get_user_info";

    public GetUserProcedure(DataSource dataSource) {
        super(dataSource, PROCEDURE_NAME);
        init();
    }

    private void init() {
        // 入力パラメーターを宣言します
        declareParameter(new SqlParameter("p_user_id", Types.NUMERIC));
        declareParameter(new SqlParameter("c", Types.STRUCT, "com"));

        compile(); // compile() を呼び出す必要があります
    }

    public Map<String, Object> getUserInfo(Integer userId) {
        Map<String, Object> inputs = new HashMap<>();
        inputs.put("p_user_id", userId);
        Calendar cal = Calendar.getInstance();
        cal.set(2023, Calendar.OCTOBER, 1, 12, 30, 45); // 注意: Calendar の月は 0 から始まります
        cal.set(Calendar.MILLISECOND, 0);

        Rec rec = new Rec();
        rec.t1 = 1;
        rec.t2 = "some text";
        rec.t3 = new Date(cal.getTime().getTime());
        rec.t4 = true;
        rec.t5 = null;
        inputs.put("c", rec);

        return execute(inputs); // ストアドプロシージャを実行します
    }
}

Apache ShardingSphere への適応

Apache ShardingSphere を通じて PolarDB for PostgreSQL (Oracle 互換) クラスターに接続し、管理することで、データシャーディングや読み書き分離などの高度な機能を実現できます。PolarDB は ShardingSphere がネイティブでサポートする PostgreSQL プロトコルと完全に互換性があるため、両者はシームレスに統合できます。

注意

接続を設定する際には、ShardingSphere が PolarDB JDBC ドライバーを正しく識別して使用できるように、以下の重要な手順に従ってください。

  • ShardingSphere の設定: ShardingSphere のデータソース設定で、driverClassNamecom.aliyun.polardb2.Driver に設定します。

  • ドライバーのバージョン: バージョン 42.5.4.0.12 (2025-08-13) 以降を使用する必要があります。

  • 接続プロトコル: jdbc:postgresql プロトコルを使用し、接続文字列の末尾に forceDriverType=true パラメーターを追加する必要があります。

接続例

以下は、ShardingSphere で PolarDB データソースを設定するための YAML の例 (config-sharding.yaml) です。

dataSources:
  ds0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.aliyun.polardb2.Driver
    jdbcUrl: jdbc:postgresql://pc-***.o.polardb.rds.aliyuncs.com:1521/postgres?forceDriverType=True
    username: ******
    password: ******
    maxPoolSize: 2
    minPoolSize: 2
  ds1:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.aliyun.polardb2.Driver
    jdbcUrl: jdbc:postgresql://pc-***.o.polardb.rds.aliyuncs.com:1521/postgres?forceDriverType=True
    username: ******
    password: ******
    maxPoolSize: 2
    minPoolSize: 2

よくある質問

JDBC ドライバーはどのように選択すればよいですか。また、オープンソースのコミュニティドライバーを使用できますか。

PolarDB for PostgreSQL (Oracle 互換) は、オープンソースの PostgreSQL の上に多くの互換性関連機能を実装しています。一部の機能は、正しく機能するためにドライバーレベルの協力が必要です。そのため、PolarDB JDBC ドライバーを使用することをお勧めします。ドライバーは公式のドライバーダウンロードページからダウンロードできます。

PolarDB JDBC ドライバーは公開 Maven リポジトリで利用できますか。

公式サイトで説明されているように、JDBC ドライバーの JAR パッケージはウェブサイトからダウンロードする必要があります。Maven プロジェクトの場合、JAR パッケージをローカルリポジトリに手動でインストールする必要があります。現在、公式サイトから JDBC ドライバーパッケージをダウンロードする方法のみがサポートされています。

バージョン番号の確認方法

java -jar driver_name を実行してバージョン番号を確認できます。

URL に複数の IP アドレスとポートを設定することはサポートされていますか。

はい、PolarDB for PostgreSQL (Oracle 互換) の JDBC ドライバー は、URL に複数の IP アドレスとポートを設定することをサポートしています。以下に例を示します。

jdbc:polardb://1.2.XX.XX:5432,2.3.XX.XX:5432/postgres
説明

複数の IP アドレスを設定した後、システムはこれらの IP アドレスを使用して順番に接続を作成しようとします。いずれの IP アドレスを使用しても接続を作成できない場合、接続は失敗します。各接続試行のタイムアウト期間はデフォルトで 10 秒です。これは connectTimeout の値です。タイムアウト期間を変更するには、このパラメーターを接続文字列に追加します。

カーソルタイプの選択方法

Java 1.8 より前の JDK バージョンを使用している場合は、Types.REF を使用します。Java 1.8 以降のバージョンを使用している場合は、Types.REF_CURSOR を使用できます。

デフォルトで大文字の列名を返すことはサポートされていますか。

JDBC 接続文字列にパラメーター oracleCase=true を追加できます。このパラメーターは、返される列名をデフォルトで大文字に変換します。以下に例を示します。

jdbc:polardb://1.2.XX.XX:5432,2.3.XX.XX:5432/postgres?oracleCase=true

更新ログ

42.5.4.0.12 (2025-08-13)

42.5.4.0.10.11 (2025-07-10)

42.5.4.0.10.9 (2025-03-19)

  • Oracle スタイルの関数パラメーターバインディングをサポートします。

  • END が解析の失敗を引き起こすバグを修正しました。

42.5.4.0.10.7 (2025-01-06)

  • ネストされたコメント (/* /* コメント */ など) を含む、Oracle 互換のコメント機能をサポートします。

  • Mybatis で Clob インターフェイスを呼び出す際に null 値を使用することが原因で発生する Misuse of castNonNull の問題を修正しました。

42.5.4.0.10.6 (2024-12-04)

  • 後の JDBC バージョンのための Channel Binding 機能をサポートします。

  • escapeSyntaxCallMode パラメーターのデフォルト値を callIfNoReturn にアップグレードし、Oracle のパラメーターバインディング動作に適応させました。

  • attidentity 認識エラーが原因で列タイプの取得が不正確になるバグを修正しました。

42.5.4.0.10.5 (2024-10-24)

  • resetNlsFormat パラメーターの設定を最適化し、接続中に正しい設定がされるようにしました。この最適化により、意図しない実行レコードが監査ログに残るのを防ぎます。

  • java.nio.Buffer 型インターフェイスを認識できないことが原因で発生する論理レプリケーションテストのエラーを修正しました。

  • ストアドプロシージャ内の CASE WHEN...END ブロックの末尾が正しく解析されない問題を修正しました。

42.5.4.0.10.4 (2024-09-02)

  • PL ブロックでの不正確なバインディングの問題を修正しました。この機能はパフォーマンスへの影響があるため、デフォルトで無効になっています。

  • 同じ型カテゴリ内での暗黙的な変換をサポートします。これにより、文字型 (VARCHARCHAR など) と数値型 (NUMERICINTEGERDOUBLE など) が INOUT パラメーターとして相互に変換できるようになります。

  • ドライバーのメタデータ内の getDatabaseProductName() 関数の戻り値は、「POLARDB2 Database Compatible with Oracle」になりました。

42.5.4.0.10.2 (2024-07-19)

  • Mybatis で、オブジェクトエンティティの登録された型が Timestamp の場合にデータベースがパラメーター型を正しく推論できない問題を修正しました。