WAS 小ワザ集

第27回:Application Anti Pattern(7) リクエスト処理中にグローバルなHashtableにアクセス

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: WAS 小ワザ集

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:WAS 小ワザ集

このシリーズの続きに乞うご期待。

Anti Pattern

あるプログラムは、プログラム全体で使用する構成情報を単一のHashtableで管理していました。プログラムは、リクエストを処理する過程で、このHashtableに格納されてる情報を随時読み出して利用していました。

Result

このプログラムは、シングルコアや少数のコアを持つサーバー上で実行している間は特に問題は見られませんでした。しかし、多くのコアを持つサーバー上で実行し、高い負荷をかけた際に、深刻なパフォーマンス低下を引き起こしてしまいました。

Best Practice

多くのコアを持つサーバー上で実行するアプリケーションにおいては、並行実行性(Concurrency)、つまり複数の処理が同時に実行可能になっていることが非常に重要となります。並行実行性が悪いアプリケーションであっても、単一のコアの環境で実行している間はほとんど問題なく動きます。ですが、このようなアプリケーションはコア数が多くなってもパフォーマンスが向上せず、場合によってはコアが増えるにしたがってパフォーマンスが悪化することすらあります。

排他制御のためにおこなわれるオブジェクトのロックは、並行実行性を損ねる代表的な原因です。Javaではオブジェクトをロックするためにsynchronized構文が使用されます。アプリケーション中でsynchronizedされた箇所を必要最小限にとどめることが、並行実行性を保つために必要です。

アプリケーションの中で明示的にsynchronized構文を使用していなくても、オブジェクトにロックがかかる場合があります。代表的な例が標準APIで提供されているHashtableです。このクラスのメソッドは全て同期化されていて、値を追加したり読み出したりするごとにロックがかかります。アプリケーションで処理ごとにHashtableの読み出しを行っていると、並行実行性の極めて悪いアプリケーションになってしまいます。

アプリケーションの処理ごとに利用される値を格納する場合には、読み書きに際してロックのかからないHashMapを利用するようにします。また、JDK 5以降を使用している場合には、ConcurrentHashMapも使用できます。ConcurrentHashMapは、書き込みではロックをかけて整合性を保ちつつ、読み出しではロックを使用せずに値にアクセスできます。

また、同じような例としてSystem.getProperty()によるシステム・プロパティの読み出しがあります。システム・プロパティは、内部でHashtableを使用して保存されているため、読み出すたびにロックが発生してしまいます。このような場合には、処理の初期化時にあらかじめシステム・プロパティを読み込んで変数に保存しておき、処理ごとの参照はその変数経由で行うようにします。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=846085
ArticleTitle=WAS 小ワザ集: 第27回:Application Anti Pattern(7) リクエスト処理中にグローバルなHashtableにアクセス
publish-date=11222012