iBATISには、キャッシュ機能があるが、メモリキャッシュはiBATISのを使うとして、ディスクキャッシュならどれがよいか比較しました。
まず、 Hibernateを参考に、同フレームワークがサポートしているキャッシングフレームワークにどんなのがあるかというとEHCache 、 OSCache 、SwarmCache 、JbossTreeCache。デフォルトは、EHCache。
その他にJCSもあります。 JCS vs EHCacheのページによるとJCSのほうが速いとかいてあります。
しかしながら、iBATISでディスクキャッシュをやるなら、OSCacheしかありません。というかOSCacheしかサポートされていません。
しかし、いろいろ調べてみると、「EHCache for iBatis」なるものがありました。これは、このフォーラムにいる人が作ったようです。とりあえず、正式にサポートしているわけではありませんが、CentOS5.0上で両者の比較をしてみました。
比較の内容は、あるテーブルに、異なる1000件の主キーで検索します。これを2回ずつ繰り返します。(1000×2の検索をします。)1回目は、DBより、2回目は、キャッシュより取得される事になります。
まず始めに、タイトルとはずれますが、メモリキャッシュ(LRUアルゴリズム)の比較です。
■iBATISでメモリキャッシュ
1回目:1000件 26秒
2回目:1000件 4秒
■OSCacheをつかってメモリキャッシュ
1回目:1000件 17秒
2回目:1000件 2秒
LinkedHashSet
■ehcacheをつかってメモリキャッシュ
1回目:1000件 24秒
2回目:1000件 12秒
内部的に使用しているクラスは、iBATISは、Collections.synchronizedMap(new HashMap())、OSCache、ehcahceは、LinkedHashMap。OSCache、ehcacheは内部的なロジックの違いで差が出ているようです。
OSCacheが一番速いです。
ちなみにiBATISのメモリキャッシュは、キャッシュのタイプ=「MEMORY」だと、「reference-type」とか選ぶことができます。
これがあるのですてがたい(?)。
次は本題のディスクです。
■OSCacheをつかってディスクキャッシュ
1回目:1000件 28秒
2回目:1000件 7秒
■ehcacheをつかってディスクキャッシュ
1回目:1000件 25秒
2回目:1000件 20秒
なんか、ehcache遅いですね。最適化されてないのでしょうか?
最後におまけの比較です。
OSCacheのディスクストアのタイプに、DiskPersistence、HashDiskPersistenceがあります。
DiskPersistenceは、1ディレクトリにオブジェクトを作っていきます。
HashDiskPersistenceは、複数のディレクトリを作り1ディレクトリ1オブジェクトです。
※先ほどは、DiskPersistenceで行いました。
この両者の比較です。
■DiskPersistence(※先ほどの結果です。)
1回目:1000件 28秒
2回目:1000件 7秒
■HashDiskPersistence
1回目:1000件 27秒
2回目:1000件 7秒
あまり変わらないので、2999件にしてみます。(3000件のデータがありませんでした)
■DiskPersistence
1回目:2999件 146秒
2回目:2999件 17秒
■HashDiskPersistence
1回目:2999件 182秒
2回目:2999件 17秒
データの出力に差が出ました。
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.4/filesystems/ext2.txt.html
に、 「一つのディレクトリ内のファイル数は、実運用上約 10-15k 個が上限になります。」とあります。
どれくらいの数のオブジェクトをキャッシュするかによって使い分ける事が必要です。
ちなみに、http://daubau.net/post/memosにOSCache × memcachedのプラグインがありました。
この報告は次回にします。




