GlassFish 付属の Java DB について

この記事はGlassFish Advent Calendar 2013の9日目として新たに書き下ろしたものです。昨日は「GlassFishのREST backend」でした。


今回は、GlassFishに付属しているJava DBについて取り上げます。

Java DBは、Apache DerbyにSun/Oracleがサポートを付加したディストリビューションです。Java DBはJDKとGlassFishにバンドルされています。

WebLogic Serverに含まれるDerby(Java DB?)については、ここでは言及を避けます。不明瞭な(というか個人的に解せない)点があるので。

JDKの場合は $JAVA_HOME/db 以下(JDK7u45の場合、バージョン10.8.3)、GlassFish 4.0の場合は glassfish4/javadb 以下に含まれています(バージョン10.9.1)。

GlassFishではJava DBが事前構成済みであり、asadminの start-database および stop-database サブコマンドでJava DBのネットワークサーバーを起動・停止出来るようになっています。asadmin経由でネットワークサーバーを起動した場合、データベースは glassfish4/glassfish/databases 以下に作成されます(NetBeans等からGlassFishと一緒に起動した場合はパスが異なります)。また、コネクション・プールを生成する前にデータベースを起動しておく必要があるため、Java DBを(ネットワークモードで)使用する場合は start-domain の前に start-database を実行する必要があります。

GlassFishでは、サンプル・データベースのコネクション・プールが DerbyPool の名称で作成されており(データベースそのものは初回アクセス時に作成されます)、jdbc/__default のJNDI名で参照することが出来ます。このサンプル・データベースはJPAのpersistence.xmlでJDBCデータソースを指定しなかった場合にも暗黙的に使用されるようです(個人的には、persistence.xmlでデータソースを指定しないようなことはやりませんが、省略時にjdbc/__defaultを参照していることは確認済みです)。

GlassFishのコネクション・プール設定でJava DBを設定する場合は、データベース・ドライバのベンダーを「JavaDB」「Derby」(ネットワークモード)または「Embedded-Derby」(埋め込みモード)にします。「JavaDB」と「Derby」は同じもので、ともにデータソース・クラス名がorg.apache.derby.jdbc.ClientDataSource40となります。「Embedded-Derby」の場合はデータソース・クラス名がorg.apache.derby.jdbc.EmbeddedDataSource40となるほか、データベース名がデータベースの絶対パスになります。${com.sun.aas.installRoot}/databases/データベース名 とすればGlassFishのインストール先に依存しない形でネットワークモードと同じ場所にデータベースを作成できます(ネットワークモードと埋め込みモードでデータベースを共有することも可能になります)。

GlassFishの設定上ではいくつかの変数を使用することが出来ます。前出の ${com.sun.aas.installRoot} は glassfish4/glassfish の実際のパス(正確にはNucleusのベース・ディレクトリ)になります。${com.sun.aas.instanceRoot} はドメインのディレクトリのパスを指し、例えば domain1 の場合は ${com.sun.aas.installRoot}/domains/domain1 と等価です。${com.sun.aas.javaRoot} はGlassFishの起動に使用したJDKのJAVA_HOMEになります。

具体的な設定項目については、Apache DerbyのドキュメントとDerbyPoolの設定内容を参照してください。

最後に注意事項です。

GlassFishはサービス化できます(WindowsのサービスまたはSolaris 10以降のSMF)が、Java DBとGlassFishを連動させる形でのサービス化はできないと考えるのが妥当です。Java DBのネットワーク・サーバーが完全に起動したことを検出するのは難しく、実際にサービス化しても上手く連動してくれないことが多いのです。サービス化したGlassFishで確実にJava DBを利用したい場合は、別のサーバーであらかじめJava DBを起動しておく環境を作るか、あるいは埋め込みモードの利用を検討してください。

asadminを使用せず、Derbyの各種スクリプトを使用することも出来ます。その場合は事前準備等、Derbyの一般的な事項に従いますので、Derbyのドキュメントを参照してください。


明日は皆さんご存じ、Javaエバンジェリストの寺田 佳央 @yoshioterada さんです。