あるお客様が、アプリケーションの挙動を詳細に調査するため、自作のロギングクラスを作成し、アプリケーション内の各所に追加されました。
このロギングクラスは、ログを記録するメソッドが呼ばれるたびに、ファイルをオープンし、ログを書き込み、クローズする、というつくりになっていました。
クライアントからのリクエストが一回行われるたびに、このロギング・メソッドは数回~十数回呼び出されるようになっていました。
ファイルのオープン・クローズという処理はかなり重い処理です。
このため、アプリケーション全体のパフォーマンスがかなり低下してしまいました。特に、ログを記録するメソッドがsynchronized指定されていたため、多くのクライアントからリクエストが集中したときには処理が直列化され、著しいパフォーマンスの劣化を招いてしまいました。
外部のリソース、たとえばファイル、ネットワーク接続、DB接続などを使用する際には、使用前にオープン、使用後にクローズの処理が必要になります。このオープン・クローズの処理は、多くの場合において非常に大きなコストのかかる重い処理です。これらの処理は極力減らすようにコーディングする必要があります。
例えば今回の例では、ファイルはロギングを担当するマネージャークラスがオープンして保持しておき、個々のログの記録が行われるときには直接ログをファイルに書き込むのではなく、マネージャークラスへログの通知を行うような設計にするべきでした。ファイルへの書き出しは、マネージャークラスが一括して、一定時間ごと、あるいは一定回数ごとに非同期的に行うようにしておけば、パフォーマンスの劣化は最小限にすることができます。
また、共有可能な外部リソースについては、プーリングによる再利用をおこなって、リソースのオープン/クローズの回数を減らすことも効果があります。
- この文章は、「WebSphereべからず集」の記事を編集・再掲したものです。WebSphereべからず集: 第4回「外部リソース利用の繰り返し」
- developerWorks Japan: WebSphere: WebSphereの日本の技術情報サイト
- developerWorks: WebSphere(US): WebSphereの英語の技術情報サイト
- developerWorks Japan: WebSphere Application Server: WebSphere Application Serverの技術情報サイト
- WebSphere Application Server 製品情報
