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もまちがいなかろう.