私がJavaのデータベースに興味を持ったのは、
以下の体験がきっかけです。
JavaのWiki/Blogツールである
SnipSnapを
試しにインストールして使ってみた時、
単にアーカイブを展開するだけというあまりの簡単さに驚きました。
通常この手のWebベースのアプリケーションは
WebサーバやらデータベースやらServletコンテナやらの
設定が面倒でインストールに手間取ることが多いです。
調べてみると、SnipSnapはJava Servletコンテナと
データベースを内蔵しているのでした。
ServletコンテナにはJetty
を、データベースには
Mckoi SQL Database
を使っています。
私はWikiのようなWebベースのアプリケーションに興味があります
(BTRONの思想をWikiで実現したいという考えがあります)。
配布する上でインストールが面倒なのは、使い勝手が悪く
ドキュメントを書くのも大変なので、インストールを簡単にする
方法には興味があります。
データベースで組み込みというと
BerkeleyDB
を思いうかべるのですが、
SQLが使えてJavaでできている、というものはあまり見覚えがありませんでした。
オープンソースでPure Javaのデータベースはいくつかあり、
トランザクションもありなかなか使えそうなので
どれが使いやすいか調べてみることにしました。
名前 | 主な利用ソフト | ライセンス | インプロセス動作 | クライアント-サーバ動作 | インメモリ | ファイルへ永続化 | トランザクション |
---|---|---|---|---|---|---|---|
HSQLDB | JBoss に内蔵 | BSD Like | ○ | ○ | ○ | ○ | ○ |
Mckoi SQL Database | SnipSnapに内蔵 | GPL | ○ | ○ | × | ○ | ○ |
axion | 不明 | Apache Like | ○ | ○ | ○ | ○ | ○ |
アプリケーションの組み込みに用いることを考えた場合、 アプリケーションのアーカイブにデータベース本体を同梱できる ことが望ましいです。
Mckoi SQL DatabaseのようにGPLだとアプリケーションをGPLにする必要がある ため、商用アプリケーションやBSDライセンスで配りたいアプリケーションには 用いることができません。 アプリケーションからデータベースを別配布にして 利用者側でデータベースをインストールする方法にすることで アプリケーションをGPLにする必要をなくすることもできますが、 これでは組み込みにするメリットが少ないので、選択しづらいです。
そこで、私はBSD LikeなライセンスのHSQLDBとaxionを選んで 試しに動かしてみることにしました。
どの程度使えるのか、簡単に手元にあった JDBCBench を用いて実験してみました。
JDBCBenchは10万件のデータに対してランダムにupdateする動作をします。 マルチスレッドで複数クライアントからのアクセスをシミュレートします。 ドキュメントにはTPC-Bから派生したものと書いてありました。
データベース名 | インメモリor永続 | URL | transactions per client | clients | Transaction/second |
---|---|---|---|---|---|
HSQLDB | 永続(CREATE CACHED TABLE) | jdbc:hsqldb:testdb | 100 | 100 | 366.47 |
HSQLDB | インメモリ | jdbc:hsqldb:mem: | 100 | 100 | 396.92 |
axion | 永続 | jdbc:axiondb:testdb:./testdb | 100 | 100 | - |
axion | インメモリ | jdbc:axiondb:testdb | 100 | 100 | - |
axionはテストデータ作成時のinsertに時間がかかりすぎるため、 テスト実行できませんでした。 commitするタイミングを変えて実験してみましたが、 時間がかかりすぎることには変わりませんでした。
axionのメーリングリストの記事 「Performance Comparison (Insert, Select) on Axion and other free source embedded」 を見ると、10万件insertが36秒で終わっているようなのですが、 私の場合は相当に遅いです。この記事は細かい条件がわからないのですが、 もしかしたらパラメタ設定が悪いのかもしれません。
HSQLDBは永続モード(CACHED)とインメモリでほとんど速さが変わっていません。 永続化したファイルはできているのですが、 ディスクアクセスが間欠的であることから、commit時にディスクにsync していない可能性があります。
HSQLDBのソースをみると、commit時にorg.hsqldb.DatabaseScriptWriterで トランザクションログファイルのファイルディスクリプタをsyncしている ようになっていました。ただ、細い条件まで追っていないため、 確実にsyncしているかどうかまではわかりませんでした。
straceでfsync()を呼んでいるかどうかを調べようとしたのですが、 strace -f でスレッドを追おうとするとJava VMがブロックしてしまうので 追えませんでした。 Linux2.4はスレッドの実装がcloneを呼んでいるという こともあって追えないのかもしれません。 それならばLinux2.6でスレッドの実装が変更になったので追えるように なっているかもしれません。 また、Green ThreadのJava VMを使えばstraceで追えたかもしれませんが、 手元になかったのでやっていません。
HSQLDBが実用になりそうです。JBossに組みこまれているだけあって
問題はたたかれているんじゃないかと予想しています。
ちゃんとsyncしていないような動作をしているので信頼性は
あまり期待できないですが、速度が速いこともあり
信頼性を重視しない用途には実用になると思います。
axionは期待していたのですがJDBCBenchが動かずいまいちの結果でした。
Mckoi SQL DatabaseはWebをみると良さそうなのですが、
ライセンスが使いにくいのが難点です。