読者です 読者をやめる 読者になる 読者になる

【AWS】JavaプログラムからRedshiftのクラスターに接続する方法

スポンサーリンク

Javaのプログラムを使用してRedshiftのクラスターに接続する方法です。

Amazon Redshift JDBC ドライバーをダウンロード

Java から Redshift へ接続するには JDBC ドライバが必要です。  JDBC 接続を設定する - Amazon Redshift からダウンロードしてクラスパスに追加してください。Maven リポジトリには登録されていませんでした。

Redshift クラスターに接続する

クラスターへの接続プログラムは以下のようになります。

import java.sql.*;
import java.util.Properties;

public class RedshiftSample {
    public static void main(String[] args) {
        String jdbcURL = "jdbc:redshift://xxxxx.xxxxx.redshift.amazonaws.com:5439/devdb";
        String user = "hoge";
        String password = "fuga1234";
        Properties prop = new Properties();
        prop.setProperty("user", user);
        prop.setProperty("password", password);

        try (Connection con = DriverManager.getConnection(jdbcURL, prop);
             Statement st = con.createStatement();
             ResultSet rs = st.executeQuery("select * from information_schema.tables;")) {
            while (rs.next()) {
                String catalog = rs.getString("table_catalog");
                String name = rs.getString("table_name");
                System.out.println("Catalog: " + catalog + ", Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

上記の例では Java7 以降のスタンダードなコーティングスタイルとなった try-with-resources 文を使用していますが、 その場合は JDBC 4.1 のドライバーを使用してください。

 try-with-resources構文について - TASK NOTES
 クラスターにプログラムで接続する - Amazon RedshiftM

JDBCフェッチサイズパラメータ

Redshift を使用するということは、大きなデータセットを取得する場合も多々あると思います。その際にメモリ不足エラーが発生する可能性がありますのでバッチで結果セットを取得できるように、JDBC フェッチサイズパラメータをプログラム側で設定するようにしましょう。フェッチサイズが低いとその分結果を取得する回数も増えて、実行時間が長くなりますので適切な値を設定します。

try (Connection con = DriverManager.getConnection(jdbcURL, prop);
     Statement st = con.createStatement()) {
    st.setFetchSize(10000);
    try (ResultSet rs = st.executeQuery("select * from information_schema.tables;")) {
        while (rs.next()) {
            String catalog = rs.getString("table_catalog");
            String name = rs.getString("table_name");
            System.out.println("Catalog: " + catalog + ", Name: " + name);
        }
    }

 クエリのトラブルシューティング - Amazon Redshift

プログラムの実行エラー

Redshift に接続するプログラムの実行時に以下のエラーが発生したのでメモとして残しておきます。

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
        at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284)
        at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238)
...

jar のパッケージングの際に以下を除外することで直りました。

exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF'

 java - "Invalid signature file" when attempting to run a .jar - Stack Overflow