S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

お試し

ブランクプロジェクトのDBってことでH2を使ってみた。
Derbyはなんかメンドクサソウだしw
で、H2を使ってみることに。
んで、使ってみたけど激軽!
1つのJARファイルで動いとるとは思えん!(Derbyもだろうけど)
サンプルとかで使うには十分っぽい!
とりあえずテーブル作って、DBViewerでいろいろ操作とかしてみた。


そのまま使うと、接続モードがエンベッドモード(スタンドアローンモード?)なので、リモートモード(サーバモード)で動かしてみる。
んで、開発/デバッグ時を想定しての複数のクライアントからのDB接続が可能なのを確認してみたり。
開発/デバッグでの利用を想定して、Eclipseから起動するためのクラスH2DbStartを作ってみた。
H2DbStartを実行するとDBが開始されて、コンソールに"stop"とタイプすると停止してみたり。
H2DbStartを配置したプロジェクトの直下に、tcp/localhostというフォルダが作成されて、そこにデータベースのデータファイルが置かれてる。
そのままデータファイルもCVSで共有して、どこでもサンプルが動かせますよ、みたいな。

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.h2.tools.Server;


public class H2DbStart {
    
    public volatile static H2DbStart starter = null;
    
    public volatile static Server SERVER = null;
    
    public static String BASE_DIR = "tcp/localhost/";
    public static String TCP_PORT = "9042";
    
    public static String DRIVER = "org.h2.Driver";
    public static String USER = "HOGE";
    public static String PASSWORD = "MOGE";
    public static String URL = "jdbc:h2:tcp://localhost:" + TCP_PORT + "/test";

    public static void main(String [] args) {
        starter = new H2DbStart();
        starter.start();
    }

    public void start() {
        if (H2DbStart.SERVER == null) {
            setServer();
        }
        if (H2DbStart.SERVER.isRunning(false) == false) {
            try {
                Thread stopThread = new StopRequestReceiver();
                stopThread.start();
                System.out.println("starting now...");
                H2DbStart.SERVER.start();
                stopThread.join();
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    }
    
    protected void setServer() {
        String [] params = {"-baseDir", H2DbStart.BASE_DIR, "-tcpPort", H2DbStart.TCP_PORT };
        try {
            H2DbStart.SERVER = Server.createTcpServer(params);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
     
    private class StopRequestReceiver extends Thread {
        
        public void run() {
            while (true) {
                InputStreamReader is = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(is);
                try {
                    if ("stop".equals(br.readLine().toLowerCase())) {
                        break;
                    }
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }
            System.out.println("stopping now...");
            H2DbStart.SERVER.stop();
            H2DbStart.SERVER.shutdown();
        }
        
    }
    
}


同じように、こんなクラスを作っといて、このクラスでコンソールを実行すれば、同じパスでコンソールが動いたりもする。

mport org.h2.tools.Console;

public class H2ConsoleStart {

	public static void main(String [] args) {
		Console.main(args);
	}
	
}


コンソールとサーバは共存できないので、開発/デバッグ時はサーバを起動して…
って調べてたら、デバッグモードでH2DbStartを実行したら問題ないのに、実行モードで実行して起動させて、stopで停止したらこんなExceptionが出てきた。

org.h2.jdbc.JdbcSQLException: 接続が壊れています
Connection is broken [90067-76]
	at org.h2.message.Message.getSQLException(Message.java:103)
	at org.h2.message.Message.getSQLException(Message.java:114)
	at org.h2.message.Message.getSQLException(Message.java:77)
	at org.h2.message.Message.getSQLException(Message.java:149)
	at org.h2.tools.Server.start(Server.java:452)
	at xxx.yyy.zzz.H2DbStart.start(H2DbStart.java:37)
	at xxx.yyy.zzz.H2DbStart.main(H2DbStart.java:25)

実行モードでサーバを起動して、DBViewerで接続しようとしても、「接続が壊れています」ってExceptionが出てるし。
正常に起動してない???
デバッグモードで起動すると、停止もDBViewerでの接続も問題ないのに(謎
またvolatile辺りの話か???と思って、volatileを入れてみたけど状況変わらず。


んで、こういうランチャっぽいEclipseプラグインが欲しいと思えば、Seasarのプロジェクトにあるっぽいけどサイトで更新っても全然落ちてこんし、jarをダウンロードして、Eclipseのpluginフォルダにおいてもなんの変化もねぇし。



自分で作るか(爆