WinstoneにDerbyを組み込んでみた

Winstoneを中心にあれこれミニマム構成を組んでみてるんだけど,Derby使うんだったら,Winstone本体に組み込んだ方が楽だなと.
#Derby起動して→Winstone起動ってのもたるいし.


思い立ったが吉日ってことで,やってみたらすげー簡単.
以下,おおまかな手順.


1.Winstoneのソースを適当なところに展開
2.IDEでプロジェクト組んで,Derbyのライブラリを追加
とりあえず,こんだけあれば十分.

derby.jar, derbynet.jar,
derbyLocale_ja_JP.jar, derbyclient.jar

3.DerbyManagerなんて,それっぽいクラスを作成
実装はね,見るからにテキトウ.

import org.apache.derby.drda.NetworkServerControl;

import java.io.PrintWriter;
import java.net.InetAddress;

public class DerbyManager {
    private NetworkServerControl derbyServer;

    public DerbyManager() {
        try {
            derbyServer = new NetworkServerControl(InetAddress.getByName("localhost"), 1527);
            derbyServer.start(new PrintWriter(System.out));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void shutdown() {
        try {
            derbyServer.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.WinstoneのLauncherをちょこっといじる
winstoneパッケージにあるLauncherに,さっき作ったDerbyManagerの初期化と終了を組み込むだけよ.
パッチっぽいのを以下に示す.

@@ -59,11 +59,15 @@
     private Cluster cluster;
     private JNDIManager globalJndiManager;
 
+    private DerbyManager derbyManager;
+
     /**
      * Constructor - initialises the web app, object pools, control port and the
      * available protocol listeners.
      */
     public Launcher(Map args) throws IOException {
+        derbyManager = new DerbyManager();
+
         boolean useJNDI = WebAppConfiguration.booleanArg(args, "useJNDI", false);
 
         // Set jndi resource handler if not set (workaround for JamVM bug)
@@ -357,6 +361,7 @@
         }
         Thread.yield();
 
+        derbyManager.shutdown();
         Logger.log(Logger.INFO, RESOURCES, "Launcher.ShutdownOK");
     }

5.winstone.jarを再アーカイブして完成
Derbyのライブラリもいっぺん展開して,winstone.jarに含めとく.
#はじめてIDEAのJar Toolプラグイン使ったけど,まあまあ便利だった.


使い方は,こんな感じ.

winstone.propertiesに,それっぽいデータソースを定義して,おしまい.

jndi.resource.jdbc/HogeDS=javax.sql.DataSource
jndi.param.jdbc/HogeDS.url=jdbc:derby://localhost:1527/derbydb;create=true
jndi.param.jdbc/HogeDS.driverClassName=org.apache.derby.jdbc.ClientDriver 
jndi.param.jdbc/HogeDS.username=hoge
jndi.param.jdbc/HogeDS.password=hoge

Winstoneを起動すると,カレントディレクトリにderbydb/ができあがる(これがDerbyのデータベース).


さっそく,テキトウなサンプル載っけてみたんだけど,そいつがOracleの方言SQL使っていたので,別なイミでダメだった.orz


ちょっと挫けたけど,なにげにこれはスゴい!!ぞと.
なにせ,とってもポータブルなので教育用とかデモ用とか,いろいろ使い道はありそうだ.


難点を言えば,WizMySQLAdminみたいなのが欲しいってのと,そもそもあたしがDerbyをよく知らないってことだ.:-D
#後者は,自分でなんとかしないとね.


ps.
ちなみにDerbyを選んだ事にイミはないス.なんというか,たまたま?
DerbyやH2みたく,組み込み用途で使える軽量データベースなら何でもできると思うので,--embededDbなんてオプションが付いたらステキ指数UPもまちがいなかろう.