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. | 編集

DebianでH2 Database Engineを起動し、別端末からJavaで接続する

Pure Javaなデータベース「H2 Database Engine」
http://www.h2database.com/html/main.html

Windowsにインストールして、その後特に触っていませんでした。
H2 Database EngineをWindowsにインストールする


Debianで起動し、別の端末から触ってみます。




H2 Database Engineのインストール



Pure Javaなので、Javaをインストールする必要があります。
今回は、OpenJDKを使うことにしました。


# apt-get install openjdk-6-jdk




zipファイルをダウンロードし、/optに展開します。

# cd /opt
# wget http://www.h2database.com/h2-2011-11-26.zip
# unzip h2-2011-11-26.zip



※unzipをインストールしていない場合は、以下のコマンドでインストール出来ます。

# apt-get install unzip





解凍すると、「h2」というフォルダが作成されます。
このフォルダの中にあるbinにh2-1.3.162.jarファイルがあります。

単純にサーバーを起動するには、

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




とすればOKですが、これではローカルからのアクセスのみに制限されます。

外部からのWebブラウザによる管理画面を有効にするには、

-webAllowOthers



外部からのtcp接続を許可するには

-tcpAllowOthers



と言うオプションを付けて起動してやります。


/opt/h2/binに移動して、外部からWebとTCP接続を許可した状態で起動してみます。

# cd /opt/h2/bin
# java -cp h2-1.3.162.jar org.h2.tools.Server -webAllowOthers -tcpAllowOthers





起動すると、こんな表示になります。

/opt/h2/bin# java -cp h2-1.3.162.jar org.h2.tools.Server -webAllowOthers -tcpAllowOthers
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 (only local connections)





Ctrl + Cで終了します。






Javaの接続サンプル




使用するJDBCドライバクラスは「org.h2.Driver」
接続文字列は「jdbc:h2:tcp://[サーバーのIP]/[データベースファイル]」

ログインユーザーは初期状態で「sa」
パスワードは設定されていません。

ビルドパスに、サーバーに展開した「h2-1.3.162.jar」を指定します。



接続するサンプルはこんな感じになりました。

package com.fc2.blog68.symfoware.h2;

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

public class Sample {

    public static void main(String[] args) throws Exception {
        
        //JDBCドライバをロード
        Class.forName("org.h2.Driver");
        
        //コネクション取得
        Connection conn = DriverManager.getConnection("jdbc:h2:tcp://192.168.1.4/~/test", "sa", "");
        Statement stmt = conn.createStatement();
        
        //テーブル作成
        stmt.execute("CREATE TABLE IF NOT EXISTS test (id integer, name varchar(10))");
        
        stmt.execute("DELETE FROM test WHERE id = 1");
        
        //データの登録
        stmt.execute("INSERT INTO test (id, name) values (1, '日本語テスト')");
        
        //登録したデータの検索
        ResultSet rs = stmt.executeQuery("select * from test");
        while(rs.next()) {
            System.out.println(rs.getString("name"));
        }
        
        stmt.close();
        conn.close();
        
    }
    
}





実行すると、コンソールに

日本語テスト


と表示されるはずです。







Webの管理画面



ブラウザで、http://[サーバーのIP]:8082/を表示すると、管理画面が表示されます。

04_001_20111205220701.png


保存済み設定に「Generic H2(Server)」を選択し、JDBC URLに「jdbc:h2:tcp://localhost/~/test」と
入力してログインすると、ちゃんとJavaから登録したTESTテーブルが確認できました。

04_002_20111205220701.png




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

  1. 2011/12/05(月) 22:07:54|
  2. H2 Database Engine
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

H2 Database EngineをWindowsにインストールする

前々から気になっていたデータベース
「H2 Database Engine」

http://www.h2database.com/html/main.html

Windowsにインストールしてみます。




インストーラーのダウンロードとインストール



トップページの「Download」にある「Windows Installer (4 MB)」のリンクを
選択すると、「h2-setup-2011-03-14.exe」が取得できます。

ダウンロードしたインストーラーを実行します。


以下、インストーラーの画面です。

01_001_20110315153944.png

01_002_20110315153943.png

01_003_20110315153943.png

01_004_20110315153943.png


これでインストールは終了です。





データベースサーバーの起動



「スタート」-「全てのプログラム」-「H2」-「H2 Console」を選択。

01_005_20110315153943.png


ブラウザにこんな画面が表示されると思います。

01_006_20110315153942.png


ユーザー名は「sa」、パスワードは空白で接続できます。
また、JDBC URLで上記画像のように、「c:/test」と入力した状態で
接続を行なうと、「C:\test.h2.db」というファイルが作成されます。
これがデータベースファイルとなるようです。




データベースサーバーの停止



データベースを起動した際、タスクトレイにアイコンが表示されると思います。

01_007_20110315154028.png


アイコンを右クリックして表示されるメニューの「Exit」を選択すると
サーバーが停止します。





サービスとして起動



Windowsのサービスとして起動するには、H2のインストールフォルダにある
serviceフォルダ(デフォルトで「C:\Program Files\H2\service」)
ここにある「1_install_service.bat」を実行します。

すると、サービスに「H2 Database Engine Service」が追加されます。

01_008_20110315154028.png


「1_install_service.bat」と同じ階層にある「2_start_service.bat」を
実行するか、サービスの画面から開始すると、H2がサービスとして起動します。



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

  1. 2011/03/15(火) 15:43:17|
  2. H2 Database Engine
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ