俺としたことが・・・

つい先日,あるところで僕が作ったソフトウェアが稼動を開始した。SSH(Struts+SpringFramework+Hibernate)の組み合わせを使って,生産性抜群な感じで32画面&13DB表数のWebアプリを2週間弱で若干の焦り気味で作りきった。機能的にはかなり喜んでもらえたのだが,一ヶ月間稼動させてみたところ,問題発生の知らせを受けた。

「検索すると,長いときは1分間以上返ってこないんですけど。。」

なんでそんなに検索かかるんだろう。。。情報量は2000件ほどみたいだし,いくらPostgreSQLでも,そんなに遅くはならんだろう,と軽く考えていた。

やっぱり焦っていい事は,何もない。

O/RマッピングツールにHibernateを使って,Lazy Loading有効にしてオブジェクトのリレーションしまくりで構築した。例えば,以下のようなエンティティがあって,Hibernateから得た部署エンティティオブジェクトが持つ社員を取得しようとしてget社員List()メソッドを呼び出すと,Lazy Loadingが気を利かせて,そこで初めてデータベースに問い合わせが行われるという流れだ。

今回の1分間以上処理がかかっていた箇所では,上記のUMLに当てはめると,「30歳以上の社員がいる部署の一覧取得」という感じの検索処理である。その検索結果として,部署オブジェクトの一覧を得ていた。そしてJSPの中で,取得した部署オブジェクトの一覧をぐるぐる回して,個別にその部署に含まれる社員をで表示させた。そうなると,部署単位で問い合わせが発生してしまう。100件部署オブジェクトを得たら100回問い合わせが起こる。それが千数百件だとしたら,,,1分間以上処理時間がかかってしまうのも当然だ。orz

これはHibernateを使う上での注意点「第1位」なことであり,すっかりそれを忘れて作ってしまった。。。反省である。

このエントリーをはてなブックマークに追加

関連記事

2023年のRemap

Remapにファームウェアビルド機能を追加しました

Google I/O 2023でのウェブ関連のトピック

2022年を振り返って

現在のRemapと今後のRemapについて