DBアクセスのトラブルは終盤で発覚しがち……:現場から学ぶWebアプリ開発のトラブルハック(4)(2/2 ページ)
本連載は、現場でのエンジニアの経験から得られた、APサーバをベースとしたWebアプリ開発における注意点やノウハウについて解説するハック集である。現在起きているトラブルの解決や、今後の開発の参考として大いに活用していただきたい。(編集部)
ソースコードを確認すると……
業務アプリケーションを開発するうえでは、必ずDBアクセスの処理を記述することになる。Javaでこれらの処理は、JDBCを利用しSQL文を実行することになるが、その際には、業務ロジックからDBアクセス処理部分を分離し、DBアクセスに関する処理を隠ぺい化するDAOパターンが有効である。
今回のWebアプリケーションのソースコードを確認してみると、iBATISフレームワークを利用し、DAOパターンにてDBアクセスの処理が記述されていた。しかし、該当の個所のソースコードは以下のような設計であった(図3)。
- 各テーブルに1:1に対応したDAOが作成されている。ここでは、ユーザーテーブル/会社テーブルに対応してUserDaoクラス、CompanyDaoクラスを定義している
- まず、ユーザーテーブルよりユーザー情報をいったん取得し、その取得データを基に再度DBにアクセスし、会社テーブルより会社情報を取得している
このような設計では、検索されたユーザー数が増えるにつれてSQL文の実行回数が大きくなってしまうため、深刻なパフォーマンスの低下を招くことが予想できる。
DBアクセス部分の設計を見直す
そこで今回は、関連があり同時にDBアクセスされるようなテーブルに対しては、表結合を利用してSQL文の実行回数を最小限に抑えることを目指した。そのため、ユーザーテーブルと会社テーブルをまとめて参照するSQL文に変更し、該当の個所を図4のような設計になるようにソースコードを修正した。
今回の修正では、表結合の利用によりSQL文の実行回数も1回に抑えることができるため、パフォーマンスが大きく改善されることが予想される。修正の効果を確認すべく、メソッドプロファイリングを再実施した。
メソッドプロファイリングの再実施
メソッドプロファイリングを再実施したところ、図5のような結果が測定された。パフォーマンスは大幅に改善され、またUserDaoのsearchUser()メソッドの呼び出し回数が1回に抑えられていることが確認できた。
この結果を踏まえて、単体テスト時にパフォーマンスの問題として認識されなかったのは、試験実施時にテーブルに投入されていたデータ数が少なかったからと想定し、担当者に確認をしたところ、まさにそのとおりであった。今回の場合、UserDaoで検索されたユーザー情報の数が少なければ、SQLの実行回数は膨大にはならないからである。
結局、そのプロジェクトで挙がっていたパフォーマンスに関する問題の多くは本件に起因するものであったため、それらに関してすべて見直しを実施し、修正する方向で、今回のトラブル対応は収束に向かうこととなった。
プロジェクト終盤での悲劇を防ぐために
今回のようにDBアクセス回りのプログラム設計によるパフォーマンス・トラブルは、機能としては問題がないため、プロジェクトの終盤で発覚することが多く、アプリケーション改修作業がプロジェクトにとって大きな負担になりがちである。
本稿はDBアクセスを題材にしているが、DBアクセスに限らず、XMLの解析処理や通信関連の処理など重い処理が絡む部分に関しては、処理の仕方によってはアプリケーションのパフォーマンスに大きな影響を与える。そのため、後工程での手戻りを防ぐためにも、設計・製造の段階から重要なレビュー観点として念頭に置いてみてはいかがだろうか。
プロフィール
NTTデータ
高橋 和也(たかはし かずや)
Web系システムでのJavaフレームワーク開発、業務アプリケーション開発と開発プロセスの策定、トラブルシューティングなどを経て、現在は、開発生産性を向上させるツール開発に従事するかたわらプロジェクトに対する主に設計・製造・試験に関する技術支援を担当している。
開発の理想論と現実論のバランスが取れた実現性のある開発ができればと思い、日々業務に従事している。
- 数百キロのコードでブルー - ドクターTomcat緊急救命
- DB操作の“壁”を壊すJPAが起こした「赤壁の戦い」
- アプリ開発でも、よ〜く考えよう。キャッシュは大事だよ
- スレッドダンプの森で覚えた死のロックへの違和感
- ThreadとHashMapに潜む無限回廊は実に面白い?
- JavaのGC頻度に惑わされた年末年始の苦いメモリ
- 肥え続けるTomcatと胃を痛めるトラブルハッカー
- 【トラブル大捜査線】失われたコネクションを追え!
- 【真夏の夜のミステリー】Tomcatを殺したのは誰だ?
- OutOfMemoryエラー発生!? GCがあるのに、なぜ?
- DBアクセスのトラブルは終盤で発覚しがち……
- 【実録ドキュメント】そのログ本当に必要ですか?
- “Stop the World”を防ぐコンカレントGCとは?
- Webアプリの問題点を「見える化」する7つ道具
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Javaデータアクセスの基礎
Javaからデータベースにアクセスする際の定番ミドルウェア「JDBC」を使ったデータアクセスを理解しよう - 第1回 JDBCとは何かを理解する(2001/6/26)
- 第2回 JDBCによるDB接続と検索の実行(2001/7/11)
- 第3回 JDBCによる更新処理の実行(2001/8/18)
- 第4回 ステートメントの高速化(2001/10/19)
- JDBC接続を高速化―PreparedCacheの活用
[連載]事例に学ぶWebシステム開発のワンポイント(11) PreparedStatementキャッシュを使うとJDBC接続を高速化することができる。実際の評価結果も含め解説する - Hibernateで理解するO/Rマッピング
スマートなデータアクセス手法として注目されるO/Rマッピングを、オープンソースHibernateを使いながら解説する - 第1回 O/Rマッピングの役割とメリット(2004/4/13)
- 第2回 JavaにおけるO/Rマッピング(2004/5/22)
- 第3回 Hibernateを試すための準備(2004/7/16)
- 第4回 簡単なプログラムでO/Rマッピングのメリットを体験(2004/8/26)
- 第5回 リレーショナルデータにおけるメリットを体験(2004/9/22)
- 第6回 O/Rマッピングの導入効果を測る(2004/12/11)
- Seasar Projectの全貌を探る
国産オープンソースプロダクトのコミュニティとして急成長するSeasar2。大手SIerもサポートを表明したJ2EEプロダクトの全貌を探る - 第3回 SeasarV2によるDBアクセス機能(2005/9/3)
- 第5回 SeasarのO/RマッピングツールS2Dao(2005/12/23)
- 第6回 SeasarのDBアクセスにHibernateを使う(2006/1/19)
- Web 2.0アプリ自動生成ツール“Tuigwaa”
ユーザー自らDB連動型のWebアプリを作る エンジニアではない一般ユーザー自らが、ブラウザの操作だけで簡単にWebアプリを作れるソフトウェア“Tuigwaa”を紹介する - 対決! O/Rマッパー vs. オブジェクト指向DB
オブジェクト指向プログラミングとリレーショナル・データベースの相性の悪さは、アプリケーション開発者の悩みの種だ。これを回避する2つの方法、O/Rマッピングツールとオブジェクト指向DBを取り上げ、Javaの永続化方式を比較する - 第1回 Javaのオブジェクト永続化に何を選ぶ?
- 第2回 HibernateとCache、Javaとの好相性はどっちだ
- 最終回 HibernateとCache、性能比較の結論を出そう