オープンソースPure Javaデータベースの比較

私が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のデータベースはいくつかあり、 トランザクションもありなかなか使えそうなので どれが使いやすいか調べてみることにしました。

オープンソース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の結果について

axionはテストデータ作成時のinsertに時間がかかりすぎるため、 テスト実行できませんでした。 commitするタイミングを変えて実験してみましたが、 時間がかかりすぎることには変わりませんでした。

axionのメーリングリストの記事 「Performance Comparison (Insert, Select) on Axion and other free source embedded」 を見ると、10万件insertが36秒で終わっているようなのですが、 私の場合は相当に遅いです。この記事は細かい条件がわからないのですが、 もしかしたらパラメタ設定が悪いのかもしれません。

HSQLDBの結果について

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をみると良さそうなのですが、 ライセンスが使いにくいのが難点です。


ホームへ戻る

落合秀俊hidetosi@aware.jp
Last modified: Sun Nov 9 10:46:48 JST 2003