Redshift JDBC Driver 2.0 を使用したらSOCKSプロキシ経由での接続エラーが解消しました

2020.11.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日、Redshift JDBC Driverのアップデート発表がありました。

Redshift JDBC Driver 2.0 では、下記の拡張機能が追加となっています。

  • データベース間でのクエリをサポート(プレビュー版)
  • 結果セットのメタデータフェッチの改善
  • reWriteBatchedInsertsSizeパラメタからバッチインサートのパフォーマンスの最適化
  • fetchRingBufferSizeパラメタにてクライアント側カーソルのサポートの改善
  • SocketFactoryのサポート

今回のアップデートを受けて、まずは個人的に痒い思いをしていたSOCKSプロキシ経由での接続できなかった問題が解消しているのかを確認してみました。

Redshift JDBC Driverで接続ができなかった問題(※SOCKSプロキシ経由)

JavaプログラムでのRedshift接続エラー

下記のブログでも書いたのですが、Redshift JDBC Driver 1.X系ではRedshiftに接続ができなかったため、PostgreSQLのJDBC Driverを使って接続エラーを回避していました。

DBeaverでのRedshift接続エラー

DBeaverでもRedshift JDBC Driver 1.X系が使われていたため、Javaプログラムでの接続同様、PostgreSQLのドライバを使って接続エラーを回避していました。

まずはDBeaverをインストール後コネクションを作成します。この際にRedshiftを選ぶとSOCKSプロキシサーバ経由での接続に失敗します。そこでPostgreSQLでコネクションを作成します。

アップデートされたRedshift JDBC Driver 2.0 を使用して、上記の件が解消されているかを確認していきます。

Redshift JDBC driver 2.0のダウンロード

下記のリンクから取得できます。

Download the Amazon Redshift JDBC driver version 2.0 driver

またGithub上でも公開されたので、プルリクエストによる機能拡張の依頼や、問題の報告もできるようになったようです。

amazon-redshift-jdbc-driver

Javaプログラムからの接続

下記のサンプルプログラムを使って、接続できるかを確認してみました。(※Javaのバージョンは1.8)

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

public class ConnectToCluster {
    static final String RedshiftDbURL = "jdbc:redshift://XXXXXXXXXX.redshift.amazonaws.com:5439/XXXXXX";
    static final String MasterUsername = "********";
    static final String MasterUserPassword = "********";
    
    public static void main(String[] args) {
        Connection conn = null;
        try{

           Class.forName("com.amazon.redshift.jdbc42.Driver"); // JDBC 4.2 互換ドライバー
           
           System.out.println("Connecting to database...");
           Properties props = new Properties();
           props.setProperty("user", MasterUsername);
           props.setProperty("password", MasterUserPassword);
           props.setProperty("ssl", "true");
           props.setProperty("sslfactory", "com.amazon.redshift.ssl.NonValidatingFactory");
           
           conn = DriverManager.getConnection(RedshiftDbURL, props);	   
           System.out.println("Connection Class : " + conn.getClass().getName());
           conn.close();
        }catch(Exception ex){
           ex.printStackTrace();
        }finally{
           try{
              if(conn!=null)
                 conn.close();
           }catch(Exception ex){
              ex.printStackTrace();
           }
        }
        System.out.println("Finished connectivity test.");
     }
}

接続できました!

Connection Class : com.amazon.redshift.jdbc.RedshiftConnectionImpl

DBeaverでの接続

DBeaverで「新しい接続」からRedshiftのドライバを選択します。(※DBeaverのバージョンは7.2.4)

必要な接続情報(ホスト名、ポート、DB名、ユーザー名、ユーザーパスワード)を設定し、「ドライバの設定を編集」を押下します。

ダウンロードしたドライバ(jarファイル)を設定します。

プロキシも忘れずに設定します。(必要に応じて、ユーザー名・パスワードを設定してください。)

上記の設定が正しくできてれば、下記のように「テスト接続」で問題なく接続済みになると思います。

おわりに

簡単な接続確認でしたが、個人的にはスッキリしました!どなたかの参考になれば幸いです。

以上、DA(データアナリティクス)事業本部のナガマサでした〜

参考