Hibernate と裏で発行される SQL

JPAは、SQLを隠蔽するものではなく、「SQLを統一的に効率良く書けるようにするもの」だからです。Gavin(Hibernatefounder)はいってました「HibernateSQLを隠蔽するものではない。SQLを統一的に効率良く書けるようにするものだ。だから、SQLの知識はちゃんと持っていなければならない」と。

「RDBMSの時代の終わりが見えてきた」についてそろそろ一言言っておくか - yvsu pron. yas

こちらもメモ。この記事でひがさんの言いたいことはこれじゃないので、ほんとは引用元にリンクしたかったけど、多分引用とかではないので、ここだけ。
Hibernate って、発行される SQL とその発行タイミングを想像しつつ書くのがいいと思う。隠蔽っていう発想は Hibernate に関してはほんとにヤバイw


まあ具体的に解決策はどうしたらいいって言えないんで、与太話なんだけども、ウチのプロジェクトで出てたので印象に残ってるのは、大量のバッチ処理で、データ件数が増えると2次曲線的に処理速度が遅くなる、という件と、オンライン処理の応答速度が遅い、という件。


バッチ処理の方は、登録を大量に行う処理だったんだけど、単純にエンティティーをガツガツ save() してた。save() することでエンティティーは永続化されるんで、データをガンガン save() していくと、どんどんプロセス内に永続化オブジェクトが溜まっていき、どーんどん処理速度が落ちていく。しかも、save() したエンティティーは2度と参照することは無い仕様。save()後evict()*1するように書き換えると解決。


2件目の方は、ループ処理の中で、load() 処理。まこれは単純にSQL発行回数の問題。仕方ない部分もあるんだけど、SQL が都度都度発行されるっていう意識が薄くなっちゃって、1画面表示するのに数百回もSQL投げるような機能であることに作ってるタイミングで気づかなかった、というもの。担当者も画面側と機能作成者で違うんで、気づきにくいんだろうねえ。


で、Hibernate は裏で何やってるかわからないので、もう使うのやめましょうという流れになりかけてる部分がある。私も現場の人間なんで、「まあ確かにね」と思う部分もあるんだけど、「HibernateSQLを統一的に効率良く書けるようにするもの」という意識があればもうちょっと違ったんじゃないかと思う。どういう風に隠蔽するかっていう社内フレームワークの方針も違ってくるだろう。

*1:永続化を解除する命令