J2EEは大規模なソフトウェアシステムの開発を念頭において設計されています。
「大規模なソフトウェアシステムと小規模なソフトウェアシステムはいったいどこが異なるのか」という疑問が出てくるかもしてませんが、その回答は分散システムにあります。
分散システムではシステムの色々なコンポーネントが複数のマシンに分散しています。
例えば、分散型のWebアプリケーションでは、1台のサーバがHTTPリクエストの受信とそれに対するレスポンスを処理し、別のサーバがビジネスロジックを全て処理し、更に、また別のサーバでデータベースの入出力を処理します。
ソフトウェアを分散システムにするのはなぜでしょうか?大規模なWebアプリケーションやエンタープライズシステムの場合ユーザーからの要求も多く、ときには1台のサーバでは処理できないほどになります。プロセッサの追加やメモリの増設によってサーバマシンをアップグレードするという対応策もありますが、この種のアップグレードはさーばの能力を限界まで拡張することにしかなりません。個別のマシンでは、いくら拡張性に優れていても、やがては限界に突き当たります。
このように単一のサーバではソフトウェアのニースに応えきれないという場合、分散システムの出番になります。複数のサーバを一緒に使うことにより、単一のサーバでは不可能な要求に応えることができます。
しかし、わざわざ分散システムを構築する必要があるのでしょうか?同じアプリケーションを複数のサーバにコピーするだけではいけないのでしょうか?ユーザの要求を複数のサーバに分散させる負荷分散という目的は、これでも達成できます。
アプリケーションの各種の論理コンポーネントを相互に切り離すメリットは、分散システムの各コンポーネントをそれぞれのニーズに応じてチューニングできることにあります。
例えば、データベース入出力を処理するサーバとTCPを介してHTTPでWebクライアントとやり取りするサーバでは、最適化の方法もことなります。