Symfoware

Symfowareについての考察blog

H2 Database Engineに、PostgresqlのJDBCドライバでJavaで接続する

H2 Database Engineのサイトを見てみると・・・
http://www.h2database.com/html/advanced.html

Postgresqlのプロトコルに対応しているみたいです。


DebianでH2 Database Engineを起動し、別端末からJavaで接続する
ここでH2のJDBCでの接続は試しました。
今回はPostgresqlのJDBCドライバを使用して接続してみます。




H2 Database Engineの起動モードの変更



外部からJDBC接続を行うため、H2を起動するとき、

# java -cp h2-1.3.162.jar org.h2.tools.Server -webAllowOthers -tcpAllowOthers


こんな感じで、「-tcpAllowOthers」というオプションをつけて
外部からのTCP接続を許可しました。

これは、H2 JDBCでの接続を許可するという意味です。
Postgresqlのプロトコルで外部接続を許可するには、
「-pgAllowOthers」
というオプションを付けて起動してやる必要があります。




/opt/h2/bin# java -cp h2-1.3.162.jar org.h2.tools.Server -webAllowOthers -tcpAllowOthers -pgAllowOthers
Web Console server running at http://127.0.1.1:8082 (others can connect)
Failed to start a browser to open the URL http://127.0.1.1:8082: Browser detection failed and system property h2.browser not set
TCP server running at tcp://127.0.1.1:9092 (others can connect)
PG server running at pg://127.0.1.1:5435 (others can connect)



「PG server running at pg://127.0.1.1:5435」以降の表示が
(only local connections)
ではなく、
(others can connect)
であれば、外部からの接続を受け入れる状態で起動していることになります。



追加で、データベースファイルを保存する位置を明確にしたかったので、
「-baseDir [保存先のパス]」
というオプションを付けて起動することにしました。

ファイルの保存先を「/opt/h2/data」とすることにします。


# mkdir /opt/h2/data



として、ファイルの保存先のディレクトリを作成した上で


# java -cp h2-1.3.162.jar org.h2.tools.Server
-webAllowOthers -tcpAllowOthers -pgAllowOthers -baseDir /opt/h2/data


※実際は一行

というコマンドで、H2を起動しておきます。








PostgresqlのJDBCドライバをダウンロード



結構前の話になりますが、PostgresqlにJDBCドライバ経由で接続したことがあります。
DebianのPostgresqlに別の端末からJDBCで接続する

ここを参考に、サンプルプログラムを作成することにしました。


まず、PostgresqlのJDBCドライバをダウンロード
http://jdbc.postgresql.org/download.html

ここから最新版の「JDBC4 Postgresql Driver, Version 9.1-901」をダウンロードし、
サンプルプログラムを作成します。

なお、Postgresqlでは接続にポート番号5432を使用しますが、
H2にはポート番号5435で接続します。

ユーザーは「sa」、パスワード空白です。



package com.fc2.blog68.symfoware.h2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class SamplePG {
    
    public static void main(String[] args) throws Exception {
        //JDBCドライバのロード
        Class.forName("org.postgresql.Driver");
        
        //接続
        String url = "jdbc:postgresql://192.168.1.4:5435/test";
        Connection con = DriverManager.getConnection(url, "sa", "");
        
        Statement stmt = con.createStatement();
        
        ResultSet rs = stmt.executeQuery("SELECT * FROM TEST");
        
        while(rs.next()) {
            System.out.println(rs.getString("NAME"));
        }
        rs.close();
        stmt.close();
        
        con.close();
    }
    
}





実行してみるとあえなく撃沈。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:571)
    at java.util.ArrayList.get(ArrayList.java:349)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1899)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:510)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:372)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:252)




データベースへの接続は行えているのですが、SELECTを実行した時に
エラーが発生してしまいます。






Postgresql - JDBCドライバのバージョン



動かないはずはないと思って調べてみると、どうやら使用するPostgresqlのJDBCドライバの
バージョンによってはデータの取得が行えることが分かりました。

postgresql-8.2-512.jdbc4.jar:OK
postgresql-8.3-607.jdbc4.jar:OK
postgresql-8.4-703.jdbc4.jar:NG
postgresql-9.1-901.jdbc4.jar:NG

8.3から8.4で、大きな仕様変更が入っているようです。


postgresql-8.3-607.jdbc4.jarを使用し、プログラムを実行してみると



日本語テスト




素っ気ないですが、ちゃんとH2のJDBCドライバを使用して登録した
データを検索することができました。


ちなみに、H2はODBCドライバを提供していないのですが、Postgresql用の
ODBCドライバを使用すれば、接続できるとのこと。

ODBCドライバでも、使用するバージョンによって同様の現象が発生するのかもしれません。






関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2011/12/06(火) 20:32:10|
  2. H2 Database Engine
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<H2 Database EngineにPythonから接続する(psycopg使用) | ホーム | DebianでH2 Database Engineを起動し、別端末からJavaで接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/851-5b189cbc
この記事にトラックバックする(FC2ブログユーザー)