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

PolarDB:JDBC

最終更新日:Jul 25, 2024

このトピックでは、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ドライバのパッケージをダウンロードする

JDBCドライバのダウンロード (42.2.9.1.5)

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クラスターへの接続に使用されるユーザー名のパスワード。

  • クエリの実行とクエリ結果の処理

    データベースでクエリを実行する前に、StatementPreparedStatment、または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に適合していません。 したがって、dbtypepostgresqlに設定する必要があります。

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.driverDelegateClassorg.quartz.impl.jdbcjobstore.PostgreSQLDelegateに設定する必要があります。

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate

WebSphereに適応する

WebSphereを使用してPolarDBに接続する前に、次の手順を実行してJDBCドライバをデータソースとして構成する必要があります。

  1. データベースタイプを [カスタム] に設定します。

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

  3. クラスのパスを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