Derby   Apache Derbyのセットアップ
  2011/01/10


Apache Derbyのインストール

JavaSE6(JDK 1.6)をインストールすると、Derbyも一緒にインストールされるので、 下記作業は不要です。 例えばWindowsでは、JDK 1.6が「C:\Program Files\Java\jdk1.6.0_17」 に配置されると同時に、Derbyも「C:\Program Files\Sun\JavaDB」に配置されます。
それを踏まえて、Derbyを単独でインストールする場合の手順が以下です。

  1. Apache Derbyのホームページから、 db-derby-10.1.2.1-bin.zipをダウンロードして展開します。
  2. Java VMにPATHが通っている(javaと打って実行できる)ことを確認します。
  3. 自分で以下のようなバッチファイルを作って、「sysinfo」ツールが動作することを確認します。

    set DERBY_INSTALL=C:\Wintools2\derby
    set CLASSPATH=%DERBY_INSTALL%\lib\derby.jar;%DERBY_INSTALL%\lib\derbytools.jar;.
    java org.apache.derby.tools.sysinfo
    

  4. 上記がOKであれば、OracleでいうSQL*Plusのような、 コマンドライン型のSQL実行ツール「ij」も利用できるはずです。 以下のようなバッチファイルでOK。

    set DERBY_INSTALL=C:\Wintools2\derby
    set CLASSPATH=%DERBY_INSTALL%\lib\derby.jar;%DERBY_INSTALL%\lib\derbytools.jar;.
    java org.apache.derby.tools.ij
    

  5. ijが起動したら、次のように打ってみましょう。

    connect 'jdbc:derby:testdb;create=true';
    exit;
    

    カレントディレクトリにtestdbというディレクトリが作られ、 その中にさらに幾つかのファイルやディレクトリが作られます。 このディレクトリ(testdb)が1個のデータベースになります。 CONNECTコマンドの引数の部分がURLですが、これに上記のように「;create=true」をつけると、 データベースが存在しない場合に新しく作ってくれます。 この属性をつけずに存在しないデータベースのパスを指定するとエラーになります。
  6. CREATE文などのSQLスクリプトファイルを実行するには、RUNコマンドを使います。

    CONNECT 'jdbc:derby:testdb';
    RUN 'shiten/area.sql';
    RUN 'shiten/shiten.sql';
    

    ファイル名はシングルクォートで囲む必要がある点に注意して下さい。
ijで一通りDB操作の確認ができれば、JDBCプログラミングの前準備は完了というものでしょう。


データ型

その前にDerbyでサポートされているデータ型ですが、以下のように豊富です:
整数型にはBIGINT、SMALLINT、INTEGERがあります。
数値型にはDECIMAL、DOUBLE、FLOAT、DOUBLE PRECISTION、REAL、NUMERIC と6種類ものデータ型がありますが、NUMERICはDECIMALの別名、 FLOATとDOUBLEはDOUBLE PRECISIONの別名なので、実質3種類ということです。 REALは4バイトのIEEE浮動小数点数を格納します。
文字列型にはVARCHAR、BLOB、CLOB、CHAR、LONG VARCHAR、 CHAR FOR BIT DATA、 VARCHAR FOR BIT DATA、 LONG VARCHAR FOR BIT DATA があります。TEXTではなくVARCHARですよ。
日付型にはDATE、TIME、TIMESTAMPがあります。
なお、JDK 1.6.0_17に付属のDerbyのバージョン(10.4.2.1)では、 精度を指定できるデータ型とできないデータ型があります。 例えば、VARCHARはVARCHAR(30)のように指定できますが、 INTEGERはINTEGER(8)のように精度を指定するとエラーになります。


その他の注意点

Derbyでは、空文字列('')とNULLの区別があります。 ijでSELECT文を発行すると、NULL値はNULLと表示されます。


JDBCドライバとURL

Apache Derbyは、スタンドアロンで動作するEmbeddedモードと、 一般のRDBMSのようにサーバープロセスがTCPで接続を待つ、 Client/Serverモードがあり、なんとそれぞれJDBCドライバのクラスが違います。 EmbeddedモードのJDBCドライバは 「org.apache.derby.jdbc.EmbeddedDriver」 サーバープロセスに接続するクライアントのJDBCドライバは 「org.apache.derby.jdbc.ClientDriver」です。 両モードのURLの例は、それぞれ以下のようになります。

jdbc:derby:databasePath;URLAttributes
jdbc:derby://{server}[:{port}]/databaseName[;URLAttributes= [;...]]

角括弧は省略可能という意味です。つまり {server}(例えばlocalhost)は省略できませんが、ポートはデフォルトの1527の場合には省略できます。
databasePathはデータベースディレクトリのパスで、 絶対パス、相対パスのどちらでも指定できます。
例えばEmbeddedモードでdatabasePathを「testdb」と指定すると、 JREの現在の作業ディレクトリの下のtestdbディレクトリが対象になります。 (URLAttributesとしてcreate=trueを指定すれば、testdbがなければ新規に作られ、 その中にデータベース・ファイルが作られます)
一方、「../testdb」のような相対パスも、 「C:/usr/dbms/testdb」のような絶対パスも可能です。 Windows環境でドライブ文字を区切る「:」を使って大丈夫かな? と一瞬心配になると思いますが、大丈夫。エスケープとかしないで普通に使って構いません。


スキーマ(ユーザ)の概念

Embeddedモードで上記のように「connect 'jdbc:derby:testdb;create=true';」 でデータベースを作ると、そのデータベースにはデフォルトで"APP"というスキーマ(ユーザ)が作られます。 が、Embeddedモードでは接続時にユーザ名を必要としないので、特に意識することはありません。
一方、Client/Serverモードでデータベースを作る際には、 URLにuserとpassword属性をつけ、さらにそのユーザで接続することになり、 その際作られたデータベースにはその名前のスキーマが作られます。

"jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine";


では、Embeddedモードで作ったデータベースに、Client/Serverモードで接続しに行くとき、 ユーザ名とパスワードは何を指定すればよいのか? が疑問ですが、両方とも、空文字列を渡すとエラーになります。 ユーザ名には"APP"を、パスワードには何でもいいので1文字以上の文字列を指定すると、 とりあえず接続できます。(おーい) 実際にはこれだとセキュリティ的に問題なので、 "APP"ユーザに正しいパスワードを設定することになりましょう。(その方法は、まだ調べています…)


必要なJARファイルの使い分け

Derbyのlibディレクトリには、以下の4つのJARファイルがあり、 用途によって必要になるものは異なります。


サーバーモードでの起動

Derbyのサーバープロセスを起動するには、大きく4つの方法があります。


JDBCクライアントの開発

HSQLDBと同様、Derbyもサーバーモード、組み込みモードそれぞれでJDBCドライバを使って、 JDBCクライアントプログラムの開発が可能です。
組み込みモードでの注意点も同じで、 プログラム終了とともにデータベースの「SHUTDOWN」を実行しないといけません。 その作法もHSQLDBと同じで、 JDBC接続のURLに";shutdown=true"を追加でつけておくと、 そのJava VMで最後の接続が閉じられたときにSHUTDOWN処理も行ってくれます。
また、DerbyはJava6SEで「Java DB」としてJDKに同梱されるようになりましたが、 それについての注意点を1つ。 標準の「Java DB」に対するJDBCクライアントを開発する場合も、 JDBCドライバ(derby.jarまたはderbyclient.jar)は、 明示的にCLASSPATHに含めておく必要があります。 java.sqlやjava.utilなどのクラスと同じように、 標準でロードしてもらえるとかそういうのはないですから。
Java DBというのは、DerbyがJDKと一緒にインストールされ、 環境変数DERBY_HOMEを設定してくれる(だけ)と考えるべきで、 それ以上の統合はされていない点に注意が必要です。


Webアプリケーションの起動・停止に連動して起動・停止する

これは上記やhsqldbの例を応用すると簡単にできそうなのですが、まだ成功していません。 Webアプリケーションの起動・停止と連動して、 DerbyのNetwork Serverを起動・停止するのは難しいようです。 DerbyはデータベースのホームディレクトリをJava VMの環境変数で指定します。 サンプルDB的な使い方をする場合、 普通Webappのディレクトリの中にデータベースのディレクトリを作ります。 従って、Webappごとにホームディレクトリを指定することができないので設定が衝突してしまいます。
WebappでDerbyを使う場合、本当に組み込み(Embedded)モードで動作させるのが良いようです。 これのサーブレット・リスナーを今作っているところです。

  もくじ
Derby   (C) 2002-2011 MISUMI URANO (2006/02/22 - 2011/01/10)