どぅーちゅいむーにー

これ、Twitterでよくね?という日々の記録かも

GlassFish 組み込みJavaDBとか


2010.12.09 追記。
どうも、本記事は前提?が狂うといろいろと問題がでそうな気がします。余力ができたら再度検証しますが、asadmin を使って start-database を実行する場所は統一しないとダメかも・・・



LinuxGlassFish をインストールし、GlassFish 組み込み JavaDB を使おうかなぁ、ということでメモ。


結論としては、パスワード制御する場合、GlassFish のコマンド(asadmin)ではなく、JavaDB のコマンドを使いましょう、となります。


○基本情報
DERBY_HOME は、/path/to/glassfishv3/javadb/
今回インストールしたのは
JDK:/usr/local/jdk/ (シンボリックリンクで名前を jdk にしているだけ。実体はjdk1.6.0_22)
GlassFish:/usr/local/glasfishv3/


GlassFish を動作させるアカウントを webap として、webap ユーザには .bash_profile に以下のように追記して PATH などを調整。


DERBY_HOME=/usr/local/glassfishv3/javadb
WEBAP_HOME=/usr/local/glassfishv3

PATH=$PATH:$HOME/bin:${WEBAP_HOME}/bin:${DERBY_HOME}/bin
export PATH WEBAP_HOME DERBY_HOME

○起動と停止

GlassFish の asadmin コマンドを利用。


起動:
% asadmin start-database
停止:
% asadmin stop-database

DBのデフォルトのポートは 1521 らしい。
ポートを指定する場合、start-database/stop-database ともに --dbport オプションで指定する


% asadmin start-database --dbport 1111
ポート指定して DB を起動した場合、stop-database のときにも正しいポートを指定する必要があるらしい。

% asadmin stop-database
2010-11-10 02:49:26.297 GMT : Could not connect to Derby Network Server on host 0.0.0.0, port 1527: Connection refused
Command stop-database failed.
Command stop-database failed.
% asadmin stop-database --dbport 1111
2010-11-10 02:49:31.420 GMT : Connection obtained for host: 0.0.0.0, port number 1111.
2010-11-10 02:49:31.871 GMT : Apache Derby Network Server - 10.5.3.0 - (802917) shutdown
Command stop-database executed successfully.



○データベースが作成される場所とか

デフォルトでは app というユーザであり、認証なしでデータベースの作成などが可能。イメージ的には


% ij
ij> connect 'jdbc:derby://localhost/test;create=true';
みたいな感じで(注意:上記文字列は実際に実行したコマンドではないので細かいミスがあるかも)。


データベースは、GlassFish インストールディレクトリの glassfish/database に作成されるみたい。
/usr/local/glassfishv3/glassfish/databases/
仮に test というデータベースを(create=true で)作成すると
/usr/local/glassfishv3/glassfish/databases/test/
というディレクトリが作成されました。


○アクセス制限
JavaDB は、derby.properties というファイルにて制御する。
このファイルはデータベースファイルが作成する場所に配置するらしい。
GlassFish 付属の JavaDB だと
/usr/local/glassfishv3/glassfish/databases/
になる。


が、これをやると asadmin start-database は使えないかもしれません・・・
でも一応、書いておきます。


記述方法については他のところでも調べられるかと思いますので、こちらの環境で設定した内容に近いものを以下に。

#derby settings

#Authentication Setting
derby.authentication.provider=BUILTIN
derby.connection.requireAuthentication=true

#Access
derby.database.fullAccessUsers=admin,myapp
derby.database.readOnlyAccessUsers=guest

derby.database.sqlAuthorization=true
derby.user.admin=adminpasswd
derby.user.myapp=hogehoge
derby.user.guest=guest
#EOF

admin のパスワードは adminpasswd で、myapp は hogehoge になります。
guest がいるかどうかはわかりません。


derby.properties を用意したら DB を再起動しましょう。
再起動後、認証なしで connect しようとすると以下のように怒られます。

% ij
ij version 10.5
ij> connect 'jdbc:derby://localhost/test';
ERROR 08004: Connection authentication failure occurred. Reason: userid or password invalid.
とまぁ、問題なさそうな感じなのですが、なぜこの derby.properties を使ってアクセス制限しようとするとダメなのかというと、derby.properties でアクセス制御を行うようにして asadmin start-database で JavaDB を起動したあと、asadmin stop-database で JavaDB を停止する際、DBを止めるためのユーザ、パスワードを渡すことができない・・・?(今のところ見つからず)
のが理由です。


derby.properties でユーザを定義したあとは、JavaDB の bin にある stopNetworkServer にユーザとパスワードを引数指定で実行することで JavaDB を止めることができます。
derby.properties を用意し、asadmin start-database で JavaDB を起動。

% asadmin start-database
Starting database in Network Server mode on host 0.0.0.0 and port 1527.
・・・ログいっぱい・・・
Starting database in the background.
Log redirected to /usr/local/glassfishv3/glassfish/databases/derby.log.
Command start-database executed successfully.
derby.properties ありで起動した状態で asadmin stop-database で止めようとすると

% asadmin stop-database
2010-11-10 03:21:29.753 GMT : Connection obtained for host: 0.0.0.0, port number 1527.
2010-11-10 03:21:30.085 GMT : 08004:Connection authentication failure occurred. Reason: Invalid authentication..
Command stop-database failed.
Command stop-database failed.
という感じで認証失敗したエラーとなる。
仕方がないので GlassFish 組み込み JavaDB の bin にある stopNetworkServer コマンドを実行する

% pwd
/usr/local/glassfishv3/javadb/bin
% stopNetworkServer -user admin -password admin123
2010-11-10 03:22:29.212 GMT : Apache Derby Network Server - 10.5.3.0 - (802917) shutdown
無事に停止できましたとさ。


asadmin での DB 起動・停止に関しては、ソースを見つけられていないけど、どこかでスタンドアロンモード(違うかも)しかサポートしない、というような記述があったような気もするので、もしかしたら本当に asadmin stop-database では認証しつつ JavaDB を止めるというのはできないのかもしれません。でも、ちゃんと調べられていないだけで、できるかもしれません。


ついでに、derby.properties にてポートを指定できるのですが、asadmin start-database を使うと、derby.properties に指定したポート番号は無視されます。asadmin start-database の --dbport を使え、ということらしい。