« 写真はものの見方をどのように変えてきたか @ 東京都写真美術館 | メイン | Shimane prefectural art musetm »

September 07, 2005

Hibernate でバッチ処理、と composite-element と Criteria

しばらく Java ばっかり使ってるので、だいぶ慣れてきた感じです。でも log4j とかあまりちゃんと使えてないですが…。ま、それはそれとして Hibernate でまた半日くらいハマったのでメモ。

データ移行などで大量のデータを一気に insert, update したりすると、自分の場合では 3000 件ちょいくらいで Out of Memory Exception が発生。え? ひょっとしてメモリリーク? 自分のソースの中を探してもそれらしきコードは見つからず、10万件以上あるのにどうすんのよこれ…とビビりましたが、正解はいつものとおり「マニュアル読め」。Google とか Hibernate Forum で検索する前にマニュアルをちゃんと見るのが正しい、というのは頭ではわかってるんですが、なかなか習慣として身につきません。うぅ。

で、Chapter 14. Batch processing によると、バッチ処理するならとりあえず

hibernate.jdbc.batch_size 20

とかしておくとマトモなパフォーマンスが出るよ、とのこと。確かに妙に遅いなーと思ってたんですが、20倍くらい早くなりました。知らなかったら何日も無駄にしてたかも。あわわ。で、メモリの問題は Hibernate のキャッシュが溜まってしまうのが原因らしく、

hibernate.cache.use_second_level_cache false

と。そして first-level cache もクリアするために、 session.flush() のあとに session.clear() を入れておく。これで問題解決でした。

ついでにもう一つ。Hibernate Forum のこのスレッドによると、

Querying collections of value type is not supported in the Criteria API. Use HQL, or change your mapping to make the composite element class an entity class.

だそうで、composite-element を Criteria で使えないってことみたい。エエー!? どうしよ、あてにしてたのに…。

投稿者 ryoji : September 7, 2005 10:21 AM

トラックバック

このエントリーのトラックバックURL:
http://ryoji.sakura.ne.jp/mt/mt-tb.cgi/212