Microsoft Windows Server AppFabric と IBM - Download Center

Microsoft Windows Server AppFabric と
IBM WebSphere eXtreme Scale 7.1 の
®
®
®
®
ベンチマーク比較レポート
アプリケーション サーバー層における分散キャッシュ
パフォーマンスの比較
2010 年 7 月 12 日
© Microsoft Corporation 2010
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 1
このドキュメントは、Windows Server® 2008 R2 および Microsoft .NET Framework 4.0 の各リリースをサポートします。
このドキュメントで公開されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したも
のです。マイクロソフトは変化する市場状況に対応する必要があるため、このドキュメントは、記載されている内容
の実現に関するマイクロソフトの確約とはみなされないものとします。また、このドキュメントに記載されている情報
の正確性に関して、マイクロソフトはいかなる保証もいたしません。このドキュメントは、情報の提供のみを目的とし
ています。明示または黙示にかかわらず、このドキュメントに関してマイクロソフトはいかなる責任も負わないものと
します。
このドキュメントに記載されている情報 (URL 等のインターネット Web サイトに関する情報を含む) は、将来予告なし
に変更することがあります。別途記載されていない限り、このドキュメントで使用している会社、組織、製品、ドメイン、
電子メール アドレス、ロゴ、人物、場所、出来事などの名称は架空のものです。実在する会社、組織、製品、ドメイン、
電子メール アドレス、ロゴ、人物、場所、出来事の名称などとは一切関係ありません。お客様ご自身の責任において、
適用されるすべての著作権関連法規に従ったご使用を願います。マイクロソフトは、本ガイドの全体または一部の転
載を認めます。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の
無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュ
メントはこれらの特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではあり
ません。
© 2010 Microsoft Corp. All rights reserved.
Microsoft、Windows Server、Windows ロゴ、Windows、Active Directory、Windows Vista、Visual Studio、Internet
Explorer、Windows Server System、Windows NT、Windows Mobile、Windows Media、Win32、WinFX、Windows
PowerShell、Hyper-V、MSDN は Microsoft グループの商標です。
その他、記載されている会社名および製品名は、各社の商標および登録商標です。
目次
エグゼクティブ サマリ ............................................................................................................................. 6
テストに使用したハードウェア構成 ................................................................................................... 7
主な調査結果 ......................................................................................................................................... 8
概要 ...................................................................................................................................................... 10
主な比較項目 ................................................................................................................................... 10
基本比較項目............................................................................................................................... 10
オブジェクト サイズの比較 ........................................................................................................... 11
スケーラビリティの比較................................................................................................................ 12
シリアル化の比較 ........................................................................................................................ 12
実装したキャッシュ ポリシー ............................................................................................................ 12
完全な情報公開について ................................................................................................................ 13
テストに使用した中間層ハードウェア プラットフォーム ...................................................................... 13
分散キャッシュ層 .............................................................................................................................. 14
Hewlett-Packard C7000 BladeSystem: HP ProLiant BL460c ブレード × 4 ..................................... 14
アプリケーション サーバー層 ........................................................................................................... 14
Hewlett-Packard C7000 BladeSystem: HP ProLiant BL460c ブレード × 4 ..................................... 14
データベース層................................................................................................................................. 14
HP ProLiant DL585 サーバー × 1 .................................................................................................. 14
HP StorageWorks EVA 4400 Disk Array ........................................................................................ 15
テスト方法とレポート対象の測定値 .................................................................................................... 16
テスト環境の仕様 ............................................................................................................................. 16
Windows Server AppFabric と IBM eXtreme Scale の構成 .............................................................. 18
Windows Server AppFabric ........................................................................................................... 18
IBM eXtreme Scale ........................................................................................................................ 18
ベンチマークの実行とレポート対象測定値の取得 ........................................................................ 18
キャッシュ ベンチマークのテスト方法.............................................................................................. 20
テスト スクリプト ............................................................................................................................ 20
ベンチマークの結果 ............................................................................................................................. 21
価格表 .............................................................................................................................................. 21
キャッシュ フェールオーバーをサポートした小容量オブジェクトのスケーラビリティ テスト .......... 21
計測期間中のキャッシュの統計情報 .......................................................................................... 22
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 3
ベンチマークについての考察 ...................................................................................................... 23
キャッシュ フェールオーバーを使用しない小容量オブジェクトのスケーラビリティ テスト............. 24
計測期間中のキャッシュの統計情報 .......................................................................................... 25
ベンチマークについての考察 ...................................................................................................... 26
キャッシュ フェールオーバーをサポートした大容量オブジェクトのスケーラビリティ テスト .......... 28
計測期間中のキャッシュの統計情報 .......................................................................................... 29
ベンチマークについての考察 ...................................................................................................... 30
キャッシュ フェールオーバーを使用しない大容量オブジェクトのスケーラビリティ テスト............. 31
計測期間中のキャッシュの統計情報 .......................................................................................... 32
ベンチマークについての考察 ...................................................................................................... 33
まとめ .................................................................................................................................................... 35
付録 A: 価格 ......................................................................................................................................... 36
テストに使用したアプリケーション サーバーの価格....................................................................... 36
IBM eXtreme Scale 7.1/Hewlett Packard BladeSystem C7000 ..................................................... 36
IBM WebSphere 7/Hewlett Packard BladeSystem C7000 ............................................................ 37
各構成の IBM ソフトウェア ライセンスの総コスト (MSRP)........................................................... 37
各構成のマイクロソフト ソフトウェアの総ライセンス コスト (MSRP)............................................ 37
付録 B: アプリケーション ワークロード................................................................................................. 38
データベース定義............................................................................................................................. 38
オブジェクト定義 ............................................................................................................................... 39
Address オブジェクト (Java) ........................................................................................................... 39
Customer オブジェクト (Java) ........................................................................................................ 40
Order オブジェクト (Java) .............................................................................................................. 42
LineItem オブジェクト (Java).......................................................................................................... 43
Address オブジェクト (C#).............................................................................................................. 44
Customer オブジェクト (C#) ........................................................................................................... 45
Order オブジェクト (C#) ................................................................................................................. 46
LineItem オブジェクト (C#) ............................................................................................................ 47
アプリケーション サーブレット (Java) ............................................................................................ 48
Test.aspx (C#) ................................................................................................................................ 53
OrderBL (Java) ............................................................................................................................... 55
OrderBL (C#) .................................................................................................................................. 63
付録 C: チューニング パラメーター ...................................................................................................... 72
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 4
WebSphere のチューニング (バージョン 7.0.0.11 64 ビット) – Windows Server 2008 R2 ............... 72
eXtreme Scale 7.1 のチューニング – Windows Server 2008 R2....................................................... 72
サーバーのプロパティ ファイル ................................................................................................... 72
ORB のチューニング ..................................................................................................................... 72
Deployment.xml ObjectGrid 展開ファイル ................................................................................... 73
ObjectGrid.XML ObjectGrid 構成ファイル .................................................................................... 73
.NET のチューニング......................................................................................................................... 74
AppFabric クライアント構成ファイル ............................................................................................ 74
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 5
エグゼクティブ サマリ
2010 年 6 月、マイクロソフトは Windows Server AppFabric をリリースし、現在無償でダウンロード提
供 (http://msdn.microsoft.com/appfabric、英語) しています。Windows Server AppFabric は
Windows Server のアプリケーション サーバーの役割に対する複数の拡張機能として提供されてお
り、任意のアプリケーションで、各パーツを個別または同時に利用できます。AppFabric は、
Windows Server 2008 上で実行されるサーバーサイド .NET アプリケーションに新たな機能を追加し
ます。Windows Server AppFabric の最初のリリースは、2 つの部分で構成されています。

AppFabric キャッシュ サービス: バックエンド データベースに格納されたデータや、ASP.NET
アプリケーションによって使用されるセッション データなど、アクセス頻度の高い情報へのア
クセスを高速化できます。

AppFabric ホスティング サービス: Windows Communication Foundation を使用して作成さ
れたサービス、特に Windows Workflow Foundation を利用して構築されたサービスの実行
と管理を簡略化できます。
このホワイトペーパーでは、AppFabric キャッシュ サービスに焦点を当て、このサービスのパフォー
マンスを IBM WebSphere eXtreme Scale 7.1 と比較して説明します。AppFabric のキャッシュ機能は、
スケーラブルで可用性の高い、ハイパフォーマンスなアプリケーションを開発するための分散キャッ
シュ プラットフォームを提供します。AppFabric キャッシュ サービスを使用すると、開発者は .NET
Framework 4.0 を使用して開発された中間層アプリケーションに対してコヒーレントなキャッシュとし
て機能する、分散型のサーバー "グリッド" を展開できます。AppFabric は複数の分散キャッシュ ノ
ードを使って、キャッシュ クラスター内の複数のサーバーにキャッシュを分割して保持します。これ
により、必要であれば、1 つまたは複数のノードが故障した場合にキャッシュのフェールオーバーを
行うようにすることも可能になります。AppFabric キャッシュ サービスの主な機能は次のとおりです。









すべてのシリアル化可能な CLR オブジェクトをキャッシュし、シンプルなキャッシュ API を通
じてアクセスを提供
エンタープライズ レベルの規模をサポート: 数十台~数百台のコンピューター
ネットワーク経由でアクセスするサービスとして構成可能
一般的なキャッシュ構成をサポート
新しいノードの追加による動的な拡張をサポート
分離された複数のキャッシュ ホスト上にキャッシュ データのコピーを格納することにより、キ
ャッシュ データの継続的な可用性をサポートする高可用性機能
自動負荷分散
Windows イベント トレーシング (ETW) や System Center などの管理ツールおよび監視ツー
ルとの統合
ASP.NET との緊密な統合により、ASP.NET セッション データをソース データベースに書き込
むことなくキャッシュ内に保存可能。この機能をアプリケーション データのキャッシュに利用
し、Web ファーム全体でアプリケーション データをキャッシュできるようにすることも可能で
す。
IBM eXtreme Scale 7.1 も同様に、IBM の ObjectGrid テクノロジに基づく分散キャッシュ環境を提供
します。eXtreme Scale は、IBM WebSphere 7.0 などの Java ベースのアプリケーション サーバーと共
に展開されるのが一般的です。IBM eXtreme Scale では Microsoft AppFabric と同様に、稼働中の複
数のノードにデータを分割でき、必要に応じて、1 つまたは複数のノードが故障した場合のキャッシ
ュ フェールオーバーをサポートできます。この 2 つのテクノロジは似ており、どちらも、分散環境で
数百台規模のコンピューターにスケール アウトできる、きわめて高速かつ信頼性の高いアプリケー
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 6
ションを展開できるようにすることを目標としています。分散型の中間層キャッシュを利用することで、
Java および .NET を使用する開発者は、スケーラビリティを向上させ、中央データベース サーバー
の負荷を大幅に削減できます。
このベンチマークでは、各プラットフォームのさまざまな構成でテストを実施し、スループット、応答
時間、アプリケーション サーバーとキャッシュ サーバー処理能力の消費量、および価格について比
較しました。比較のため、すべての構成テストは同じハードウェア構成で実施されました。
テストに使用したハードウェア構成

データベース サーバー × 1: HP ProLiant DL585、AMD 64 ビット プロセッサ (1.8 GHz) × 4。
サーバーには 32 GB の RAM を搭載。このデータベース サーバーでは、64 ビット版の
IBM DB2 v9.7 Enterprise Edition for Windows Server 2008 (eXtreme Scale の全テスト)、
および 64 ビット版の Microsoft SQL Server 2008 Enterprise Edition (Windows Server
AppFabric の全テスト) を実行します。チューニングの詳細は「付録 C」に掲載していま
す。

アプリケーション サーバー × 1 ~ 4: Hewlett Packard BladeSystem C7000、クアッドコア
プロセッサ (3.0 GHz) 1 基搭載 (ブレードあたり 4 コア) の HP ProLiant BL460c ブレード ×
2。各アプリケーション サーバー ブレードには 16 GB の RAM を搭載し、Windows
Server 2008 R2 を実行します。アプリケーション サーバーには、IBM WebSphere
7.0.0.11 64 ビット版 (eXtreme Scale の全テスト) および Microsoft .NET Framework 4.0
64 ビット版 (Windows Server AppFabric の全テスト) を使用。チューニングの詳細は「付
録 C」に掲載しています。

キャッシュ サーバー × 2: Hewlett Packard BladeSystem C7000、クアッドコア プロセッサ
(3.0 GHz) 1 基搭載 (ブレードあたり 4 コア) の HP ProLiant BL460c ブレード × 2。各キャ
ッシュ サーバー ブレードには 16 GB の RAM を搭載し、Windows Server 2008 R2 を実
行します。キャッシュ サーバーには 64 ビット版 IBM WebSphere eXtreme Scale 7.1 (社
内バージョン 4.0、V7.1.0.0) (eXtreme Scale の全テスト) および Microsoft Windows
Server AppFabric 64 ビット版 (Windows Server App Fabric の全テスト) を使用。IBM
eXtreme Scale 構成では、IBM JVM バージョン 1.6.0 (IBM Windows 64 ビット版、ビルド
pwa6460sr2-20080818_01 SR2) をコンテナー JVM として使用します。チューニングの
詳細は「付録 C」に掲載しています。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 7
主な調査結果
この調査からは、主に次のような結果が得られました。

IBM eXtreme Scale 7.1 と Microsoft Windows Server AppFabric はいずれも、安定した分散
キャッシュ グリッドの提供を通じて、ビジネス アプリケーションのスケーラビリティとパフォー
マンスを大幅に向上させることが可能

どちらの製品も中央データベース サーバーの使用率/負荷を大幅に削減できる

キャッシュ フェールオーバー (レプリケーション) のサポートを有効にした主なテスト ケース
では、Microsoft Windows Server AppFabric が IBM eXtreme Scale 7.1 よりもパフォーマン
スに優れている

同じハードウェア構成で実行して比較した場合、Microsoft Windows Server AppFabric は、
IBM eXtreme Scale の数分の 1 のコストでより優れたパフォーマンスを達成

キャッシュ レプリケーションを有効にした小容量オブジェクトのテストでは、1 秒あたりのトラ
ンザクション数で比較した場合、Microsoft Windows Server AppFabric ソリューションは IBM
eXtreme Scale ソリューションの 22% のコストしか必要とせず、15% 優れたパフォーマンスを
実現

キャッシュ レプリケーションを有効にした大容量オブジェクトのテストでは、1 秒あたりのトラ
ンザクション数で比較した場合、Microsoft Windows Server AppFabric ソリューションは IBM
eXtreme Scale ソリューションの 22% のコストしか必要とせず、11% 優れたパフォーマンスを
実現
次の表に、テストで実際に使用した製品の全コストと、1 秒あたりの連続的ピーク トランザクション
数で計測した相対的パフォーマンスを示します。以下に示す数値は、アプリケーション サーバーの
ライセンス コスト (キャッシュ クライアント) と分散キャッシュ サーバーのライセンス コストの両方に
基づいています。価格の詳しい明細は「付録 A」に掲載しています。価格は、テストに使用したハー
ドウェア構成の実現に必要なライセンスの、メーカー希望小売価格に基づいて算出されています。
以下の構成はすべて、まったく同一のハードウェア環境でテストされています。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 8
テスト対象の
プラットフォーム
分散キャッシュ
サーバー
アプリケーシ
ョン サーバー
中間層ソフトウェア
のライセンスの総
1
コスト
ピーク TPS レートで
計測したパフォーマ
ンス
価格パフォー
マンス比率
(達成した TPS
レートあたり
のコスト)
キャッシュ レプリケーションを有効にした小容量オブジェクトのテスト
IBM WebSphere
と IBM eXtreme
Scale 7.1 (キャッ
シュ フェールオ
ーバー構成)
Microsoft .NET
と Windows
Server AppFabric
(キャッシュ フェ
ールオーバー構
成)
2
4
$115,048.00
3,230
$35.62
(達成した TPS
あたり)
2
4
$24,828.00
3,711
$6.69
(達成した TPS
あたり)
キャッシュ レプリケーションを有効にした大容量オブジェクトのテスト
IBM WebSphere
と IBM eXtreme
Scale 7.1 (キャッ
シュ フェールオ
ーバー構成)
Microsoft .NET
と Windows
Server AppFabric
(キャッシュ フェ
ールオーバー構
成)
2
4
$115,048.00
2,522
$45.62
(達成した TPS
あたり)
2
4
$24,828.00
2,790
$8.90
(達成した TPS
あたり)
1
全価格の明細は付録 A を参照してください。価格には、IBM WebSphere 7、IBM eXtreme Scale 7.1、
および Windows Server 2008 R2 の適切な MSRP 価格からなる、すべての中間層ソフトウェアのライ
センス コストが含まれます。中間層サーバーのハードウェア コストは、比較したすべての IBM 構成
およびマイクロソフト構成で同一のため (比較テストはまったく同じハードウェア構成で実施)、価格
には含まれません。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 9
概要
このホワイトペーパーで示す分散キャッシュ プラットフォームの比較分析では、一般的なアプリ
ケーション サーバーのワークロードを使用して、複数の異なるシナリオでパフォーマンスを比
較しました。いずれの構成でも、2 台のキャッシュ サーバーと 1 台のデータベース サーバーを
使用します。アプリケーション サーバーのノード数は 1 ~ 4 台に変化させ、アプリケーション サ
ーバー ノードを新たに追加するごとに各種のデータを取得しました。これには、中間層アプリ
ケーション サーバー ノードを増やすことによってピーク スループットがどのように変化するかを
確認する目的があります。分散キャッシュ サービスを利用する場合と利用しない場合の相対
的なパフォーマンスとスケーラビリティを示すため、キャッシュを不使用の状態でもテストを実
施しています。
このベンチマーク テストのもう 1 つの目的は、キャッシュ レプリケーションを実行するのに必要
なオーバーヘッドを示すことです。キャッシュ レプリケーションをオンにすると、MS Windows
Server AppFabric と IBM eXtreme Scale はいずれも、キャッシュされたデータを稼働中の複数の
ノードにコピーします。物理キャッシュ サーバーが 2 台ある場合、各サーバーには、プライマリ
キャッシュ データのセット (アプリケーション サーバーからのアクセス用) と、他のキャッシュ サ
ーバー上にあるプライマリ データのレプリカの両方が格納されます。こうした構成では、一方
のキャッシュ サーバーが故障すると、もう一方のキャッシュ サーバーが故障したサーバーのプ
ライマリ キャッシュを提供するプライマリ キャッシュ サーバーとなり、キャッシュ データが失わ
れることがありません。MS Windows Server AppFabric と IBM eXtreme Scale はいずれも、数百
台のキャッシュ サーバーをサポートします。ただし、このホワイトペーパーで示すテストでは、
一貫して 2 台の物理キャッシュ サーバーを稼働させており、キャッシュ レプリケーションをオン
にしたアプリケーション サーバー ノードを構成に追加してピーク スループット レートを計測す
ることにより、それらのサーバーで処理できるアプリケーション サーバーの負荷量を計測して
います。
主な比較項目
以下に示すすべてのケースで、キャッシュの読み取り、削除、更新といった各種の処理をオブ
ジェクトの数を変えながら実行しています。ワークロードの正確な詳細 (実行したすべてのテス
トで共通) については、後続のセクションで説明しています。また、各テスト実行について、キャ
ッシュ読み取り率、キャッシュ削除率、およびキャッシュ挿入/更新率も示します。全体のキャッ
シュ ヒット率とキャッシュ ミス率も併せて掲載します。
基本比較項目
1. キャッシュを無効化: この場合、すべての読み取り処理はそのままデータベースにアク
セスします。
2. キャッシュ レプリケーションを無効化: このケースでは、2 台のキャッシュ サーバーそ
れぞれに、データベースから読み取ったオブジェクトをキャッシュする目的にのみ使用
する同量のメモリが割り当てられます。このため、後続の読み取り処理はほとんどが
キャッシュから実行され、データベースからの再読み取りは行われません。この構成で
は、各キャッシュ サーバーが、キャッシュにオブジェクトを格納するための 10 ギガバイ
トのメモリを使用できます。理論的には、最大 20 ギガバイトのデータをキャッシュでき
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 10
ることになります。ただし、AppFabric と IBM eXtreme Scale はいずれも、それぞれのメ
モリを CLR および Java ベースのガベージ コレクション ロジックに基づいて管理してい
ます。この構成のすべてのケースでは、割り当てられたメモリの範囲内でキャッシュを
維持するため、キャッシュの保存に LRU (Least Recently Used) アルゴリズムを使用して
います。IBM eXtreme Scale と Microsoft AppFabric はいずれも、キャッシュ オブジェクト
を複数のサーバーに自動的に分割するため、特別なアプリケーション ロジックをまっ
たく必要とせずに、2 台のキャッシュ サーバー間で均等な負荷分散が達成されます。
3. キャッシュ レプリケーションを有効化: このケースは、キャッシュ レプリケーションを無
効化した上記の構成と類似しており、アプリケーション ロジックおよびキャッシュされる
オブジェクトはまったく同じです。ただし、フェールオーバーをサポートするため、キャッ
シュ レプリケーションをオンにします。この場合も、各サーバーにはオブジェクトを格納
するために 10 ギガバイトが割り当てられます。ただしこれは、理論的には合計 10 ギ
ガバイトのデータ ストレージを使用して、各サーバーが 5 ギガバイト分の一意のオブジ
ェクトをキャッシュできることを意味します。これは、各オブジェクトを二重に保持する必
要があるためです (1 台のサーバーではプライマリ キャッシュとして、もう 1 台のサー
バーではレプリカとして保持)。IBM eXtreme Scale と Microsoft AppFabric はいずれも、
プライマリ キャッシュとレプリカ キャッシュを複数のサーバーに自動的に分割するため、
均等に負荷が分散されます。
オブジェクト サイズの比較
上に挙げた 3 つの基本比較項目のそれぞれについて、2 種類のオブジェクト サイズを適用して
別々のベンチマーク テストを実行しました。

小容量の Order オブジェクト (AppFabric キャッシュのサイズは約 1 K)

大容量の Order オブジェクト (AppFabric キャッシュのサイズは約 7 K)
各オブジェクトに必要なストレージの容量はテストするプラットフォームに応じて異なり、IBM
eXtreme Scale の場合は選択するシリアル化タイプによっても異なります (シリアル化については後
続のセクションを参照)。データベースのモデル オブジェクトとして使用するため、C# および Java で
ビジネス層用にまったく同じオブジェクトを定義しました。これらのオブジェクトは、.NET/AppFabric プ
ラットフォーム用には C# で、WebSphere/eXtreme scale プラットフォーム用には Java で記述されまし
た。キャッシュ エンジンでは各オブジェクトをシリアル化してキャッシュするため、すべてのケースで
オブジェクトはシリアル化可能としてマークされており、分散キャッシュ サーバーとの間でオブジェク
トを読み書きすると、アプリケーション サーバー層によって自動的にオブジェクトがシリアル化また
は逆シリアル化されます。オブジェクトには、Customer (顧客)、Address (住所)、Order (注文)、およ
び LineItem (品目) があります。Order オブジェクトには Customer オブジェクトが含まれ、各
Customer オブジェクトには 2 つの Address オブジェクト (送付先と請求先) が含まれます。さらに、各
Order オブジェクトには 1 ~ n 個の LineItem が含まれます。小容量オブジェクトのテスト ケースで
は、各注文に品目が 1 つずつ含まれます。大容量オブジェクトのテスト ケースでは、各 Order オブ
ジェクトに異なる品目が 50 個ずつ含まれます。C# および Java のオブジェクト ソースのリストと、デ
ータベース層に使用されるそれぞれのデータベース スキーマについては、「付録 A」を参照してくだ
さい。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 11
スケーラビリティの比較
2 台の分散キャッシュ専用サーバーにおいて、アプリケーション サーバー層の水平的スケーラビリ
ティがどのように実現されるかを確認するため、すべてのベンチマークは負荷分散された 1、2、3、4
台のアプリケーション サーバーを使用して実施しました。分散キャッシュ サーバーのノードの数を 2
台に固定し、アプリケーション サーバー層をスケール アウトすることで、この固定数のキャッシュ サ
ーバーによってどれだけの負荷量に対応し、スケール アウト効果が得られるかを調べました。この
結果から、アプリケーション サーバーのノード数の増加と共に、各テスト シナリオでトランザクション
スループットがどのように増減したかがわかります。4 台のアプリケーション サーバー ノードを稼働
させるまでに、AppFabric および eXtreme Scale のいずれの場合も、2 台のキャッシュ サーバーがボ
トルネックとなりました。ただし、実行された構成ごとにボトルネックの発生回数は異なります。どち
らの環境でも、この時点で新たにキャッシュ サーバーを追加すれば、さらにソリューションを拡張で
きます。ここでは意図的にキャッシュ サーバーを 2 台に固定してテストを実施し、各テスト構成で
Windows Server AppFabric と IBM eXtreme Scale を実行した場合のキャッシュ サーバーのピーク パ
フォーマンス (ピーク スループット時) を比較しています。
シリアル化の比較
Windows Server AppFabric では、常に組み込みの .NET CLR シリアル化が使用されます。ただし、
IBM eXtreme Scale について、IBM は一部の (すべてではない) ケースでパフォーマンス向上に役立
つ特別なバイト配列によるシリアル化 (copyMode = "COPY_TO_BYTES") の使用を推奨しています。
そのため、IBM eXtreme Scale については、既定の Java をベースとしたクラスのシリアル化と、特別
な COPY_TO_BYTES 設定の両方を使用してテストしました。これらのテストでは、COPY_TO_BYTES モ
ードの方がはるかにパフォーマンスに優れていることがわかりました。
実装したキャッシュ ポリシー
テストに使用したシナリオではすべて、次のキャッシュ ポリシーを適用しています。
a) アプリケーションによって明示的にキャッシュから削除されるか、各製品のメモリベースの削
除モデルに基づいて自動的に削除される場合を除き、オブジェクトはテストの実行期間中
全体を通じてキャッシュされます。各キャッシュ サーバーには専用の 10 GB のキャッシュ ス
トレージがあり、95% を上限としてメモリベースでキャッシュが削除されます。ただし、今回
のテスト ケースでは、テスト実行中に計測された処理の割合 (キャッシュの読み取り、キャッ
シュの削除、キャッシュの挿入/更新) から考えて、キャッシュ オブジェクトを保持する専用
RAM は、一連のオブジェクトをすべて格納可能な十分な量が割り当てられていたと判断で
きます。
b) このビジネス シナリオでは、キャッシュ サーバー上のオブジェクトが失効しないようにする
必要があるため、ニア キャッシュは使用していません。Windows Server AppFabric および
IBM eXtreme Scale にはいずれもニア キャッシュがあり、アプリケーション サーバーごとに、
キャッシュ データの一部をアプリケーション サーバーのインメモリに保持しておくことができ
ます。ただし、どちらの製品の場合も、ニア キャッシュを使用するということは、アプリケーシ
ョン層のデータがキャッシュ サーバー上のデータとしては失効している可能性があることを
意味します。このテスト シナリオでは、常にアプリケーション層がキャッシュ サーバーから直
接データを取得し、キャッシュが失効しないようにしました。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 12
c) オプティミスティック ロック戦略を使用しています。Cache.Put 処理を eXtreme Scale と
AppFabric キャッシュ サービスの両方で実行し、ロック タイムアウトを 10 秒に設定していま
す。いずれの製品でも、Get 処理の際に排他的ロックは行われません。さらに、オブジェクト
の更新を実行せず、削除を実行しています。
d) テスト時の処理構成は、77.7% が読み取り、11.15% が削除、11.15% が挿入処理です。2 こ
れにより、ベンチマーク テストの実行中は継続的に、新しいキャッシュの格納と、キャッシュ
の複製処理 (キャッシュ レプリケーション テストの場合) が実行されるようになります。テスト
実行中は絶えずオブジェクトが削除されるので、実際に展開されたアプリケーションと同様
に、JVM および CLR の標準のガベージ コレクションも発生します。
e) データベースと中間層キャッシュには、テストを実行する前にすべてのオブジェクトが読み
込まれています。キャッシュの削除処理が行われると、対象のオブジェクトに次回アクセス
する際は、データベースから再度読み込む必要があります。ただし、キャッシュを削除して
もデータベース アイテムは削除されません。オブジェクトは中間層キャッシュから削除され
るだけであり、次回そのオブジェクトが要求されたときはデータベースの情報で更新されま
す。
完全な情報公開について
このベンチマークに関するすべてのソース コード、テスト スクリプト フロー、およびテスト方法は、こ
のホワイトペーパー内で公開しています。すべての読者がこのコードを利用し、自身でベンチマーク
を実施して結果を確認するほか、他のハードウェア構成でベンチマークを実施できます。ベンチマ
ーク結果は十分な時間をかけて取得されたものであり、テスト対象プラットフォームの最適なチュー
ニングを示すものとなっています。マイクロソフトはこの結果について十分な確信を持っています。
ぜひお客様ご自身でキットをダウンロードして、今回のテストの各ワークロードを使った独自の比較
テストを実施し、機能面および技術面のレビューを行ってください。
テストに使用した中間層ハードウェア プラットフォーム
テストの主な目的は、IBM WebSphere および eXtreme Scale 7.1 からなる構成と、同じハードウェア
構成で Microsoft .NET および Windows Server AppFabric を実行する場合を比較し、パフォーマンス
と関連コストを明らかにすることです。すべてのケースで、アプリケーション サーバー層および分散
キャッシュ層は、Microsoft Windows Server 2008 R2 を実行する、同じ Hewlett Packard C7000 ブレ
ード システム (Intel ベース) 上で実行されています。データベースは HP DL585 サーバー上で実行さ
れており、このサーバーも Microsoft Windows Server 2008 R2 を実行しています。eXtreme
2
これは、キャッシュでメモリベースの削除 (両方の製品で等しく設定済み) が実行されない場合の
概算値です。サーバー全体のキャッシュ メモリにはすべてのオブジェクトを格納できますが、継続
的に削除処理が呼び出されるため、一定の割合の挿入処理が実行されます。メモリベースの削除
処理が発生している場合 (発生は、厳密には、同じ固定メモリ量と、同じ上限値および下限値の場
合、各プラットフォームの性能による) は、インフラストラクチャによってだけでなく、ベンチマーク ワ
ークロードによってもオブジェクトが明示的に削除されるため、挿入率が削除率よりも高くなります。
テスト実行中に測定された実際の統計情報によると、いずれのテスト実行でもメモリベースの削除
は発生していません。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 13
Scale/WebSphere のテストでは、64 ビット版の IBM DB2 9.7 Enterprise Edition をデータベースとして
使用し、IBM の最新の JDBC type 4 ドライバーを介してアクセスします。データ アクセスはメインのア
プリケーション サーブレットからの単純な JDBC コマンド呼び出しによって実行され、インライン スク
リプトによってデータが JSP ページに表示されます。Microsoft AppFabric テストのデータベースにつ
いては、SQL Server 2008 と ADO.NET 4.0 が使用されます。データ アクセスは ASP.NET Web フォー
ムから実行され、インライン スクリプトによって表示されます。SQL ステートメントとデータ アクセス層
(JDBC および ADO.NET) は、プラットフォーム間で同一になるよう構成されています。
ハードウェア コストとソフトウェア コストを含むすべての価格明細については、「付録 A」に掲載して
います。すべてのテストにおいて、各プラットフォームでは同じデータベース ハードウェアとディスク
構成を使用しました。キャッシュを不使用の構成を除き、データベースがテストに使用した中間層プ
ラットフォームのボトルネックとならないよう、これらは注意深く監視されました。さらに、ネットワーク
が原因でボトルネックが発生することがないよう、ネットワークも注意深く監視されました。そのため、
計測されたパフォーマンスは、テスト対象の中間層ハードウェアとソフトウェア プラットフォームで達
成されるピーク TPS レートを正確に表しているものと言えます。
分散キャッシュ層
Hewlett-Packard C7000 BladeSystem: HP ProLiant BL460c ブレード × 4
 Hewlett Packard ProLiant BL460c ブレード × 2
 クアッドコア Intel® Xeon® E5450 (3.00 GHz、1333 MHz FSB、80W) プロセッサ × 1 (各
ブレードに搭載)


32 GB の RAM (各ブレードに搭載)
Microsoft Windows Server 2008 R2 64 ビット版 (各ブレードで実行)

1 GB の NIC × 2 (各ブレードに搭載)
アプリケーション サーバー層
Hewlett-Packard C7000 BladeSystem: HP ProLiant BL460c ブレード × 4
 Hewlett Packard ProLiant BL460c ブレード × 1 ~ 4

クアッドコア Intel® Xeon® E5450 (3.00 GHz、1333 MHz FSB、80 W) プロセッサ × 1 (各

ブレードに搭載)
32 GB の RAM (各ブレードに搭載)

Microsoft Windows Server 2008 R2 64 ビット版 (各ブレードで実行)

1 GB の NIC × 2 (各ブレードに搭載)
データベース層
HP ProLiant DL585 サーバー × 1
 AMD Opteron プロセッサ (1.8 GHZ) × 4

32 GB の RAM (サーバーに搭載)

1 GB の NIC × 2 (サーバーに搭載)

IBM DB2 9.7 Enterprise Edition 64 ビット版または Microsoft SQL Server 2008 Enterprise 64
ビット版 (サーバーで実行)
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 14

Microsoft Windows Server 2008 R2 Enterprise Edition 64 ビット版 (サーバーで実行)
データベース ストレージ仕様
HP StorageWorks EVA 4400 Disk Array
 15K ドライブ × 96
 論理ボリューム × 2 (各ボリュームは 48 ドライブ)

論理ボリューム 1: ログ用

論理ボリューム 2: データベース用
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 15
テスト方法とレポート対象の測定値
各テスト結果では、連続的ピーク TPS (1 秒あたりトランザクション数) のスループット レートを示して
います。これは、テスト ツールを使用して 30 分間計測したレートの平均値です。キャッシュは事前
に読み込み、15 分間のウォーミングアップ時間をとって、状態が安定していることを確認してから計
測を開始しました。テストでは、HP Mercury LoadRunner を使用して負荷の生成と結果の取得を行
いました。TPS レートの基になる 1 トランザクションは、ユーザーに 1 ページ全体が返されるまでと定
義されます。返される 1 ページ (1 トランザクション) で、複数のキャッシュ処理が実行されている点
に注意してください。各ページでは、次のロジックが実行されます。
1. Address キャッシュから Address オブジェクトを取得します。キャッシュにない場合はデータ
ベースから取得してキャッシュに格納します。キャッシュ キーはブラウザーから入力された
顧客 ID です。このキーは 1 ~ 5,000 のランダムな数字です。そのため、読み込み後のキャ
ッシュには 5,000 個の Address オブジェクトが含まれます。
2. Customers キャッシュから Customer オブジェクトを取得します。キャッシュにない場合はデ
ータベースから取得してキャッシュに格納します。キャッシュ キーはブラウザーから入力さ
れた顧客 ID です。このキーは 1 ~ 5,000 のランダムな数字です。そのため、読み込み後の
キャッシュには 5,000 個の Customer オブジェクトが含まれます。
3. Orders キャッシュから 5 つの Order オブジェクトを取得します。キャッシュにない場合はデー
タベースから取得してキャッシュに格納します。キーは 1 ~ 1,000,000 のランダムな数字で
す。そのため、読み込み後のキャッシュには 1,000,000 個の Order オブジェクトが含まれま
す。
4. 手順 3 で最後にキャッシュから読み込まれた (またはキャッシュに挿入された) Order オブジ
ェクトを Orders キャッシュから削除します。
各ページを返す (テスト結果の 1 トランザクションに相当) には、別々のキャッシュ読み取りが 7 回と、
キャッシュ削除が 1 回実行されます。ページを表示するたびに Order オブジェクトが 1 つキャッシュ
から削除されるため、処理全体ではおよそ 11.15% の割合でキャッシュ ミス (および、その後のデー
タベース アクセスとキャッシュ挿入) が発生します。
テスト環境の仕様
テストでは、60 台の物理クライアント マシン (1.2 GHz、512 MB RAM) を使用してテスト スクリプトを
実行しました。各クライアントは数百の異なるユーザーとして要求を実行し、思考時間は 1 秒間に
設定されています。アプリケーション サーバー間の負荷分散はテスト スクリプトによって実現されま
す。複数の同じスクリプトが各アプリケーション サーバーに対して実行され、各サーバーでは、2 つ
のスクリプトを同時に実行することによって、そのサーバー上の 2 つの NIC 間でネットワーク負荷分
散が行われます。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 16
図 1: IBM eXtreme Scale 7.1 および Microsoft Windows Server AppFabric キャッシュ サービスによるキャッシュ
ベンチマークで使用したテスト環境です。スケーラビリティをテストするため、アプリケーション サーバー数は 1
~ 4 ノードに増加させます。テストに使用したすべてのキャッシュ構成には、常に 2 台の分散キャッシュ サー
バーが含まれます。キャッシュを無効化したテストではキャッシュ サーバーは使用されません。.NET AppFabric
のテストでは、各キャッシュ サーバーが、2 台のサーバーからなるキャッシュ クラスター内の AppFabric キャッ
シュ ホストとして動作しています。各キャッシュ ホストには、専用の RAM ストレージが 10 GB ずつ割り当てら
れます。IBM eXtreme Scale のテストでは、物理キャッシュ サーバーごとに 3 つの ObjectGrid コンテナーが実
行されています。各コンテナーにはヒープ スペースが 3.333 GB ずつ割り当てられ、AppFabric のテストと同様
に、物理サーバーごとに専用の RAM ストレージが合計 10 GB 割り当てられます。eXtreme Scale では、各サー
バーで (ヒープを 10 GB にして) 物理 JVM インスタンスを 1 つだけ実行する場合と比較して、1 台の物理マシン
で複数のコンテナー/JVM を実行することによって、ガベージ コレクション サイクルが短くなり、より均等に負荷
が分散されるため、パフォーマンスが向上することがわかりました。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 17
Windows Server AppFabric と IBM eXtreme Scale の構成
Windows Server AppFabric
各物理キャッシュ サーバーは AppFabric キャッシュ サービス (2 台のサーバーによるクラスター構
成) を実行しています。各ホストには専用の 10 GB のストレージが割り当てられており、95% を上限
としてメモリベースの削除処理が実行されます。このクラスターには、3 種類の異なるキャッシュが
あります。



Address
Customers
Orders
Microsoft Windows Server AppFabric および IIS/.NET の全チューニングの詳細については、「付録 C」
を参照してください。
IBM eXtreme Scale
IBM eXtreme Scale では、1 台の物理サーバーで複数のコンテナー ノードを実行すると効果的であ
ることがわかりました。こうすると、JVM ガベージ コレクション サイクルが短くなり、より均等に負荷
が分散されて、全体的なスループットが向上します。今回のテストでは、1 台の物理サーバーで 3
つの ObjectGrid コンテナー/JVM (ObjectGrid クラスター全体では 2 台の物理サーバーで 6 ノード)
を実行しました。使用するバッキング マップ/キャッシュは次の 3 種類です。



Address
Customers
Orders
それぞれのバッキング マップには 6 つのパーティションがあります。各コンテナーのヒープ サイズ
は 3.333 GB で、キャッシュに利用可能な総メモリ量は AppFabric 構成と同じです (物理サーバーあ
たり 10 GB)。ここでは、次の 3 種類のガベージ コレクション モードを使用してテストを実施しました。



-Xgcpolicy:optthruput
-Xgcpolicy:optavgpause
-Xgcpolicy:gencon
テストにより、明らかに既定のモードの optthruput が最も優れたスループットを達成し、最も信頼性
の高い設定であることがわかりました。そのため、すべての結果はこの GC モードのものです。JVM、
IBM ORB、IBM WebSphere、IBM eXtreme Scale の全チューニングの詳細については、「付録 C」を参
照してください。
ベンチマークの実行とレポート対象測定値の取得
すべてのケースでは、ピーク スループットが計測されるまで繰り返しテストを実行し、システムにユ
ーザーを登録しました。アプリケーション サーバーおよびキャッシュ サーバーからなる中間層シス
テムのチューニングが適切であることを確認するため、測定に先立って大規模なベンチマーク テス
トが実施されました。標準的でよく使用される指標 (計測された TPS レートで除算したプラットフォー
ムのコスト) を使用して、対象のパフォーマンスの実現にどの程度コストがかかるかをよりわかりや
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 18
すく表すため、このホワイトペーパーではテストに使用したそれぞれの構成について、連続的ピーク
TPS レートと、算出された TPS あたりの価格コスト (価格パフォーマンス比率) を示します。この計算
方法は、TPC (Transaction Processing Council) などの各種テスト機関における価格パフォーマンス測
定のレポート方法と同じです。
ハードウェアのコストは比較したすべての構成で同一のため、コストは中間層のアプリケーション サ
ーバーのソフトウェア ライセンス コストと、キャッシュ サーバーのライセンス コストに基づいて計算
しています。中間層ソフトウェアの価格に関するメモと詳細を、「付録 A」に掲載しています。価格は
各ベンダーの公表価格に基づいています。
Windows Server 2008 R2 のどのエディションにも、すべての.NET 機能が含まれ、アップグレード バ
ージョンの .NET (今回のテストで使用した .NET 4.0 など) も MSDN から無償でダウンロードできるこ
とに注意してください。つまり、.NET アプリケーションに関し、追加または個別のアプリケーション サ
ーバー コストが発生することはありません。WebSphere のような商用 JAVA EE 5 アプリケーション サ
ーバーは、個別のライセンスが必要な (一般に非常に高価な) 製品です。さらに、Windows Server
AppFabric は MSDN から無償でダウンロードできますが、IBM eXtreme Scale は独立して販売されて
いる製品です。そのため、テストに使用した構成のコストや、TPS レートあたりの価格コストの比較を
見て、驚かれるお客様もいるかもしれません。
また、今回のテストでは、IBM WebSphere/eXtreme Scale プラットフォームと
Microsoft .NET/Windows Server AppFabric プラットフォームについて、一般的ではあっても限定的な
ワークロードをテストしました。各製品の比較にはまったく同じワークロードを使用していますが、異
なるワークロードと異なる構成を使用した場合は、各プラットフォームで異なる結果が得られるでし
ょう。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 19
キャッシュ ベンチマークのテスト方法
テスト スクリプト
今回のベンチマーク テストでは、HP Mercury LoadRunner を使用して、テスト スクリプト (Web アプリ
ケーションを実行するブラウザー操作) を記録しました。これらを、60 台のクライアント マシン
(Windows XP デスクトップ、512 MB の RAM 、500 MHz) で実行しました。また、ユーザー エージェン
トの構成により、各要求の間に 1 秒の思考時間が設定されました。各ベンチマークの実行は、安定
状態までのウォーム アップ ランと、30 分の測定時間で構成されます。TPS レートは、LoadRunner に
よって算出された 30 分間の平均となります。エラー発生率は、計測期間を通じて監視し、常に
0.01% 未満になるよう維持しました。各アプリケーションに対しては、チューニング段階で何度も (文
字どおり何百回も) テストを繰り返して導き出した、その構成でのピーク スループットにあたる数ま
でユーザーによる要求を実行しました。テストに使用したソフトウェア/ハードウェア構成のピーク ス
ループットを達成するため、IBM WebSphere および eXtreme Scale のチューニング (付録を参照) に
は膨大な時間をかけています。このテストの目的はキャッシュ サーバーのパフォーマンスをテスト
することなので、このケースではテスト スクリプトを直接ポート 9080 の IBM WebSphere Web コンテ
ナー (インプロセスの HTTP リスナー) に対して実行し、IBM WebSphere 環境のオーバーヘッドが増
幅する原因となる IBM HTTP Server は使用していない点に注意してください。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 20
ベンチマークの結果
このセクションで詳細を示すベンチマークの結果には、中間層ソフトウェアのライセンス コストに関
する次の価格比較表を当てはめることができます。以下の価格には、「付録 A」に詳細を掲載した、
アプリケーション サーバーおよび分散キャッシュ サーバーのメーカー希望価格をそのまま使用して
います。
価格表
プラットフォーム
IBM eXtreme Scale 7.1 および
IBM WebSphere 7
Microsoft Windows Server
AppFabric および Microsoft .NET
アプリケーション サーバー ノ
ード 4 台およびキャッシュ サ
ーバー ノード 2 台のコスト
$115,048.00
$24,828.00
キャッシュ サーバー ノードを 1 台
追加 (スケールアップ) するコスト
$32,008.00
(キャッシュ サーバー ノードあたり)
$5,998.00
(キャッシュ サーバー ノードあたり)
詳しいコスト明細は「付録 A」を参照してください。参考価格は、アプリケーション サーバー ノードあたり 4 コア、およびキ
ャッシュ サーバー ノードあたり 4 コアを前提としています。コストには、Windows Server 2008 R2 OS の適切なライセンス
コストが含まれます。
キャッシュ フェールオーバーをサポートした小容量オブジェクトのスケーラビリティ テスト
図 2: アプリケーション サーバー ノード数を 1 ~ 4 台に増加させた場合の、ベンチマーク テストのピーク TPS レートの折れ
線グラフです。キャッシュ ノードは 2 台に固定し、AppFabric および IBM eXtreme Scale でキャッシュの同期レプリケーショ
ンを実行します。各ケースではレプリカが 1 つ保持され、1 台のサーバーが故障しても、他のサーバー上にキャッシュ デ
ータのバックアップが用意されています。Mercury LoadRunner を使用してテスト中のシステムに HTTP 要求を送信し、仮
想ユーザーに HTML ページを返しています。この構成で、各 Order オブジェクトには品目が 1 つずつ含まれます。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 21
図 3: 上記の図 2 で示したデータの棒グラフです。
計測期間中のキャッシュの統計情報
次の表には、テスト用にワークロードを調整した状態で計測された、実際のキャッシュ統計情報を
示しています。この表から、テストの実行中にメモリベースの削除処理は発生していないことがわか
ります。このことは、削除率と挿入率が同じであることから判断できます。
テストに使用した
構成
ヒット率
IBM eXtreme Scale および
COPY_TO_BYTES
IBM eXtreme Scale および
COPY_READ_COMMIT
Microsoft Windows Server
AppFabric
85.60%
ミス率
読み取り率
削除率
挿入率
14.40%
77.80%
11.10%
11.10%
85.60%
14.40%
77.70%
11.10%
11.20%
86.7%
13.3%
77.9%
11.00%
11.11%
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 22
図 4: アプリケーション サーバー ノード 4 台およびキャッシュ サーバー ノード 2 台による小容量オブジェクトのテストに関
する IBM eXtreme Scale と Microsoft Windows Server AppFabric の価格パフォーマンス比率です。価格パフォーマンス比
率は、テストに使用したプラットフォームの価格コストを各プラットフォームの合計 TPS レートで除算して算出されるため、
値が低いほど良い結果になります。こうして指標を標準化することにより、対象のパフォーマンスの実現に必要なソリュー
ション コストがわかります。
ベンチマークについての考察
TPS スループット レートに注目すると、分散キャッシュによる中間層のスケール アウトが効果的であ
ることがはっきりとわかります。IBM eXtreme Scale 7.1 および Microsoft Windows Server AppFabric
ではいずれも、アプリケーション サーバー ノードを 1 台しか稼働させない場合でも、スループット レ
ートがデータベース (IBM DB2 または SQL Server 2008) によって制限されます。分散キャッシュを使
用すると、こうしたデータベースによるボトルネックが解消され、使用しない場合に比べて大幅に優
れたスループット レートが実現されます。このベンチマークでは、2 台の分散キャッシュ サーバーノ
ードに対して 4 台のアプリケーション サーバー ノードをキャッシュ クライアントとして稼働させていま
すが、Windows Server AppFabric は IBM eXtreme Scale 7.1 よりも高いパフォーマンスを示しました。
これは、たとえ IBM eXtreme Scale を eXtreme Scale の COPY_TO_BYTES モードで実行した場合でも、
Windows Server AppFabric の方が効率性に優れていることを示しています。この小容量オブジェク
トのテストの場合、既定の Copy_On_Read_Commit モードは、eXtreme Scale COPY_TO_BYTES モー
ドよりも大幅に低速であった点に注意してください。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 23
キャッシュ フェールオーバーを使用しない小容量オブジェクトのスケーラビリティ テスト
図 5: アプリケーション サーバー ノード数を 1 ~ 4 台に増加させた場合の、ベンチマーク テストのピーク TPS レートです。
キャッシュ ノードは 2 台に固定し、AppFabric および IBM eXtreme Scale でキャッシュのレプリカは保持されません。
Mercury LoadRunner を使用してテスト中のシステムに HTTP 要求を送信し、仮想ユーザーに HTML ページを返していま
す。この構成で、各 Order オブジェクトには品目が 1 つずつ含まれます。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 24
図 6: 上記の図 5 で示したデータの棒グラフです。
計測期間中のキャッシュの統計情報
次の表には、テスト用にワークロードを調整した状態で計測された、実際のキャッシュ統計情報を
示しています。この表から、テストの実行中にメモリベースの削除処理は発生していないことがわか
ります。このことは、削除率と挿入率が同じであることから判断できます。
テストに使用した
構成
ヒット率
IBM eXtreme Scale および
COPY_TO_BYTES
IBM eXtreme Scale および
COPY_READ_COMMIT
Microsoft Windows Server
AppFabric
85.70%
ミス率
読み取り率
削除率
挿入率
14.30%
77.80%
11.10%
11.10%
85.70%
14.30%
77.60%
11.20%
11.20%
86.60%
13.40%
77.40%
11.20%
11.20%
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 25
図 7: アプリケーション サーバー ノード 4 台およびキャッシュ サーバー ノード 2 台による小容量オブジェクトのテストに関
する IBM eXtreme Scale と Microsoft Windows Server AppFabric の価格パフォーマンス比率です。価格パフォーマンス比
率は、テストに使用したプラットフォームの価格コストを各プラットフォームの合計 TPS レートで除算して算出されるため、
値が低いほど良い結果になります。こうして指標を標準化することにより、対象のパフォーマンスの実現に必要なソリュー
ション コストがわかります。
ベンチマークについての考察
キャッシュ レプリケーションを使用しないこのベンチマークから、どちらの製品の場合も、当然なが
らキャッシュ レプリケーションを使用するとスループットが犠牲になることがわかります。ただし、多く
の場合、キャッシュ レプリケーション モードが提供する信頼性を考えれば、そのメリットはパフォー
マンスの低下を上回ります。このテストでは、2 台の分散キャッシュ サーバーに 4 台のアプリケーシ
ョン ノード (キャッシュ クライアント) から接続した場合でも、Microsoft Windows Server AppFabric で
はスケールアウトの効果が発揮されています。ただし、これらのキャッシュ サーバーはクライアント
ノードが 4 台の時点でボトルネックとなっており、アプリケーション サーバーを 5 台にしてもスケール
アウトの効果はほとんど見られない点に注意が必要です。この時点で、キャッシュ クラスターに新
たな Windows Server AppFabric キャッシュ ホストを追加すれば、4 台を超えるアプリケーション サー
バー キャッシュ クライアントを使用し、アプリケーション サーバー層をさらに水平的に拡張できます。
一方で、IBM eXtreme Scale を同じ 2 台のキャッシュ サーバー上で実行した場合、アプリケーション
サーバー ノードは 3 台までしかスケールアウトできません。すなわち、このベンチマークも、
Microsoft Windows Server AppFabric の方が IBM eXtreme Scale よりも効率性に優れていることを示
しています。次のグラフで、キャッシュ レプリケーションを使用した場合と使用しない場合の、パフォ
ーマンス/スループットの変化を示します。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 26
図 8: このグラフは、小容量オブジェクトのテストに関し、キャッシュ レプリケーションを使用した場合と使用しない場合の
相対パフォーマンスの変化を示しています。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 27
キャッシュ フェールオーバーをサポートした大容量オブジェクトのスケーラビリティ テスト
図 9: アプリケーション サーバー ノード数を 1 ~ 4 台に増加させた場合の、ベンチマーク テストのピーク TPS レートです。
キャッシュ ノードは 2 台に固定し、AppFabric および IBM eXtreme Scale でキャッシュの同期レプリケーションを実行します。
各ケースではレプリカが 1 つ保持され、1 台のサーバーが故障しても、他のサーバー上にキャッシュ データのバックアッ
プが用意されています。Mercury LoadRunner を使用してテスト中のシステムに HTTP 要求を送信し、仮想ユーザーに
HTML ページを返しています。この構成で、各 Order オブジェクトには品目が 50 個ずつ含まれます。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 28
図 10: 上記の図 9 で示したデータの棒グラフです。
計測期間中のキャッシュの統計情報
次の表には、テスト用にワークロードを調整した状態で計測された、実際のキャッシュ統計情報を
示しています。この表から、テストの実行中にメモリベースの削除処理は発生していないことがわか
ります。このことは、削除率と挿入率が同じであることから判断できます。
テストに使用した
構成
IBM eXtreme Scale および
COPY_TO_BYTES
IBM eXtreme Scale および
COPY_READ_COMMIT
Microsoft Windows Server
AppFabric
ヒット率
ミス率
読み取り率
削除率
挿入率
85.70%
14.30%
77.80%
11.10%
11.10%
86.00%
14.00%
77.80%
11.10%
11.10%
86.50%
13.50%
77.90%
11.10%
11.00%
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 29
図 11: アプリケーション サーバー ノード 4 台およびキャッシュ サーバー ノード 2 台による大容量オブジェクトのテストに関
する IBM eXtreme Scale と Microsoft Windows Server AppFabric の価格パフォーマンス比率です。価格パフォーマンス比
率は、テストに使用したプラットフォームの価格コストを各プラットフォームの合計 TPS レートで除算して算出されるため、
値が低いほど良い結果になります。こうして指標を標準化することにより、対象のパフォーマンスの実現に必要なソリュー
ション コストがわかります。
ベンチマークについての考察
この構成で、IBM の既定のモードである Copy_On_Read_Commit は、IBM WebSphere 7/DB2 でキャ
ッシングをまったく使用しなかった場合のスループットを超えることはありません。ただし、
Copy_Bytes モードは、IBM WebSphere 7 および IBM DB2 を使用したキャッシュ不使用の構成よりも
はるかに優れたスケーラビリティを達成します。それでも、小容量オブジェクトのベンチマーク同様、
Windows Server AppFabric の方が IBM eXtreme Scale よりも高いパフォーマンスを示しています。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 30
キャッシュ フェールオーバーを使用しない大容量オブジェクトのスケーラビリティ テスト
図 12: アプリケーション サーバー ノード数を 1 ~ 4 台に増加させた場合の、ベンチマーク テストのピーク TPS レートです。
キャッシュ ノードは 2 台に固定し、AppFabric および IBM eXtreme Scale でキャッシュのレプリカは保持されません。
Mercury LoadRunner を使用してテスト中のシステムに HTTP 要求を送信し、仮想ユーザーに HTML ページを返していま
す。この構成で、各 Order オブジェクトには品目が 50 個ずつ含まれます。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 31
図 13: 上記の図 12 で示したデータの棒グラフです。
計測期間中のキャッシュの統計情報
次の表には、テスト用にワークロードを調整した状態で計測された、実際のキャッシュ統計情報を
示しています。この表から、テストの実行中にメモリベースの削除処理は発生していないことがわか
ります。このことは、削除率と挿入率が同じであることから判断できます。
テストに使用した
構成
IBM eXtreme Scale および
COPY_TO_BYTES
IBM eXtreme Scale および
COPY_READ_COMMIT
Microsoft Windows Server
AppFabric
ヒット率
ミス率
読み取り率
削除率
挿入率
85.70%
14.30%
77.80%
11.10%
11.10%
85.70%
14.30%
77.80%
11.10%
11.10%
86.50%
13.50%
77.90%
11.10%
11.00%
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 32
図 14: アプリケーション サーバー ノード 4 台およびキャッシュ サーバー ノード 2 台による大容量オブジェクトのテストに関
する IBM eXtreme Scale と Microsoft Windows Server AppFabric の価格パフォーマンス比率です。価格パフォーマンス比
率は、テストに使用したプラットフォームの価格コストを各プラットフォームの合計 TPS レートで除算して算出されるため、
値が低いほど良い結果になります。こうして指標を標準化することにより、対象のパフォーマンスの実現に必要なソリュー
ション コストがわかります。
ベンチマークについての考察
すべてのキャッシュ ホストでキャッシュ レプリケーションを無効にして行った、このベンチマークの結
果は、キャッシュ レプリケーションを有効にした前述のベンチマークの結果と類似しています。この
結果と前述のベンチマークとを比較すると、どちらの製品の場合も、当然ながらキャッシュ レプリケ
ーションを使用することでパフォーマンスが犠牲になることがわかります。この大容量オブジェクトの
テストでは、IBM eXtreme Scale のパフォーマンスがわずかに Windows Server AppFabric を上回っ
ていますが、キャッシュ レプリケーションを無効化して COPY_TO_BYTES モードを実行した場合に限
ります。次のグラフで、キャッシュ レプリケーションを使用した場合と使用しない場合の、パフォーマ
ンス/スループットの変化を示します。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 33
図 15: このグラフは、大容量オブジェクトのテストに関し、キャッシュ レプリケーションを使用した場合と使用しない場合の
相対パフォーマンスの変化を示しています。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 34
まとめ
IBM eXtreme Scale 7.1 および Microsoft Windows Server AppFabric キャッシュ サービスは、データ
ベースのボトルネックを軽減する機能を提供すると同時に、ビジネス オブジェクトの信頼性の高い
分散キャッシュ環境を実現します。このベンチマークでは、徹底的なテストを通して、複数の分散キ
ャッシュ ノード間でキャッシュ レプリケーションを実行するシナリオでは、Microsoft Windows Server
AppFabric が IBM eXtreme Scale よりもパフォーマンスに優れていることが証明されました。テストに
使用した製品の価格は、Windows Server AppFabric が、価格パフォーマンスの点でもはるかに有利
であることを示しています。調査結果から、特に以下のことがわかります。

同じハードウェア構成で実行して比較した場合、Microsoft Windows Server AppFabric
は、IBM eXtreme Scale 7.1 の数分の 1 のコストでより優れたパフォーマンスを達成

キャッシュ レプリケーションを有効にした大容量オブジェクトのテストでは、1 秒あたりの
トランザクション数で比較した場合、Microsoft Windows Server AppFabric ソリューション
は IBM eXtreme Scale ソリューションの 22% のコストしか必要とせず、15% 優れたパフォ
ーマンスを実現

キャッシュ レプリケーションを有効にした小容量オブジェクトのテストでは、1 秒あたりの
トランザクション数で比較した場合、Microsoft Windows Server AppFabric ソリューション
は IBM eXtreme Scale ソリューションの 22% のコストしか必要とせず、11% 優れたパフォ
ーマンスを実現
お客様には、「付録 B」に掲載しているソース コードを確認し、ワークロードを検討したうえで、ご自
身でベンチマークを実施して 2 つの製品を比較することをお勧めします。
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 35
付録 A: 価格
基本となる価格設定、および価格パフォーマンス比率に使用した価格を以下に示します。価格はベ
ンダーから直接入手した、一般に公表されている希望小売価格に基づいています。価格に消費税
は含まれません。
オペレーティング システム
のエディション
Windows Server 2008 R2
Standard
単価 (MSRP)
使用したプラットフォーム
$1,209.00
Windows Server 2008、R2
エクスターナル コネクタ
ライセンス
$1,999.00
Windows Server 2008 R2
Enterprise
$3,999.00
IBM WebSphere 7 および
eXtreme Scale で構成したすべて
のサーバー、および .NET アプリ
ケーション サーバー ノード
IBM WebSphere 7、IBM eXtreme
Scale、Microsoft .NET、および
AppFabric で構成したすべてのサ
ーバー (テストに使用したすべて
の構成)
Microsoft .NET/AppFabric で構成
されたキャッシュ サーバー
(AppFabric 分散キャッシュには
Enterprise Edition が必須)
テストに使用したアプリケーション サーバーの価格
価格には、各構成で使用されたサーバーの中間層ソフトウェアのライセンス コストと、適切な
Windows Server R2 の価格が含まれます。データベース ソフトウェアのコストと中間層/データベー
ス ハードウェアのコストは含まれません。アプリケーション サーバーの IBM WebSphere 7
Application Server エディションは価格に含まれます (テストに使用したチップセット上の Intel/AMD
の 1 コアあたり 50 プロセッサ Value Unit)。また、.NET 4.0/Microsoft Windows Server 2008 構成の
場合は追加のアプリケーション サーバーは必要ありません。.NET は Windows Server 2008 に統合
されており、新しいバージョンは MSDN から無償でダウンロードできます。さらに、Windows Server
2008 AppFabric は MSDN から無償でダウンロードできますが、キャッシュ サービスを使用するには
Windows Server 2008 R2 Enterprise Edition が必要です。
IBM eXtreme Scale 7.1/Hewlett Packard BladeSystem C7000
価格は、IBM パスポート アドバンテージ (http://www01.ibm.com/software/lotus/passportadvantage/pvu_licensing_for_customers.html、英語) より入手
しました。
IBM WebSphere Application Server プロセッサ Value Unit (PVU: Processor Value Unit) ライセンス +
ソフトウェア サブスクリプション/12 か月サポート、4003 × $144.00 = $57,600.00 (両方のサーバーで、
合計 8 コア)
3
Intel XEON 1 コアあたり 50 PVU、テスト システム全体では Intel Xeon 8 コア (IBM eXtreme Scale サ
ーバーごとに 4 コア)
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 36
IBM WebSphere 7/Hewlett Packard BladeSystem C7000
価格は、IBM パスポート アドバンテージ (http://www01.ibm.com/software/lotus/passportadvantage/pvu_licensing_for_customers.html、英語) より入手
しました。
IBM WebSphere Application Server プロセッサ Value Unit (PVU: Processor Value Unit) ライセンス +
ソフトウェア サブスクリプション/12 か月サポート、2004 × $47.75 = $9,550.00 (サーバーあたり。各サ
ーバーは 4 コア)
各構成の IBM ソフトウェア ライセンスの総コスト (MSRP)5
アプリケーション サーバー ノード × 1: IBM WebSphere 7 + eXtreme Scale 構成 + OS の総コスト:
$76,774.00
アプリケーション サーバー ノード × 2: IBM WebSphere 7 + eXtreme Scale 構成 + OS の総コスト:
$89,532.00
アプリケーション サーバー ノード × 3: IBM WebSphere 7 + eXtreme Scale 構成 + OS の総コスト:
$102,290.00
アプリケーション サーバー ノード × 4: IBM WebSphere 7 + eXtreme Scale 構成 + OS の総コスト:
$115,048.00
各構成のマイクロソフト ソフトウェアの総ライセンス コスト (MSRP)6
アプリケーション サーバー ノード × 1: Windows Server (Standard Edition および Enterprise Edition)
の総コスト: $15,204.00
アプリケーション サーバー ノード × 2: Windows Server (Standard Edition および Enterprise Edition)
の総コスト: $18,412.00
アプリケーション サーバー ノード × 3: Windows Server (Standard Edition および Enterprise Edition)
の総コスト: $21,620.00
アプリケーション サーバー ノード × 4: Windows Server (Standard Edition および Enterprise Edition)
の総コスト: $24,828.00
4
Intel XEON 1 コアあたり 50 PVU、システムのサーバー (ブレード) あたり 4 コア合計 4 ~ 16 コアで
テスト (1 ~ 4 台の Web アプリケーション サーバー)
5
すべてのキャッシュ サーバー ノードとアプリケーション サーバー ノードの Windows Server 2008
R2 Standard Edition および Windows Server 2008 R2 エクスターナル コネクタ ライセンスの MSRP を
含む
6
2 台のキャッシュ サーバー ノードの Windows Server 2008 R2 Enterprise Edition および Windows
Server 2008 R2 エクスターナル コネクタ ライセンスと、全アプリケーション サーバー ノードの
Windows Server 2008 R2 Standard Edition および Windows Server 2008 R2 エクスターナル コネクタ
ライセンスの MSRP を含む
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 37
付録 B: アプリケーション ワークロード
アプリケーション ワークロードの中心を占めるのは、中間層分散キャッシュ (Windows Server
AppFabric または IBM eXtreme Scale) 内に格納されたオブジェクトを要求する Web アプリケーション
です。オブジェクトがキャッシュ内で見つからない場合、そのオブジェクトはデータベースから取得さ
れ、適切なキャッシュ (Orders キャッシュ、Customers キャッシュ、または Address キャッシュ) に挿入
されます。便宜上、データベース内にオブジェクトが見つからない場合は、そのオブジェクトを作成し
てデータベースとキャッシュに挿入します。このように、データベースにはベンチマーク自体によって
データが読み込まれます。ただし、すべてのベンチマーク テストは、全データベース オブジェクトが
挿入され、全オブジェクトがキャッシュに読み込まれた後で実施されました。
データベース定義
次に、データベース スキーマを示します。
Address テーブル
列名
データ型
(SQL Server)
CUSTOMERID
FIRSTNAME
LASTNAME
ADDRESS1
ADDRESS2
CITY
STATE
ZIP
データ型
(DB2)
Int
VarChar 250
VarChar 250
VarChar 250
VarChar 250
VarChar 250
VarChar 250
VarChar 250
Int
VarChar 250
VarChar 250
VarChar 250
VarChar 250
VarChar 250
VarChar 250
VarChar 250
非 Null
X
主キー
X
Customer テーブル
列名
CUSTOMERID
CONTACTFIRSTNAME
CONTACTLASTNAME
CONTACTPHONE
LASTACTIVITYDATE
CREDITCARDNUMBER
CREDITCARDEXPIRATI
ONDATE
データ型
(SQL Server)
Int
VarChar 250
VarChar 250
VarChar 250
DateTime
VarChar 250
VarChar 250
データ型
(DB2)
Int
VarChar 250
VarChar 250
VarChar 250
Timestamp
VarChar 250
VarChar 250
非 Null
X
主キー
X
TheOrders テーブル
列名
ORDERID
ORDERSTATUS
ORDERDATE
ORDERTOTALAMOUNT
CUSTOMERID
データ型
(SQL Server)
Int
Int
DateTime
Decimal (14,4)
DateTime
データ型
(DB2)
Int
Int
Timestamp
Decimal (14,4)
Timestamp
非 Null
X
主キー
X
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 38
LineItem テーブル
列名
ORDERID
ITEMID
PRODUCTID
PRODUCTDESCRIPTION
ORDERQUANTITY
UNITPRICE
データ型
(SQL Server)
Int
Int
Int
VarChar 250
Int
Decimal (14,4)
データ型
(DB2)
Int
Int
Int
VarChar 250
Int
Decimal (14,4)
非 Null
X
X
主キー
X
X
オブジェクト定義
データベース情報をモデル化するモデル オブジェクトは C# および Java で定義されます。これらの
オブジェクトが、分散オブジェクト キャッシュにキャッシュされます。
Address オブジェクト (Java)
package CachePerf;
public class Address implements java.io.Serializable
{
private
private
private
private
private
private
private
private
private
static final long serialVersionUID = 1L;
java.lang.String customerID;
java.lang.String firstName;
java.lang.String lastName;
java.lang.String address1;
java.lang.String address2;
java.lang.String city;
java.lang.String state;
java.lang.String zip;
public Address() {
}
public java.lang.String getFirstName() {
return firstName;
}
public void setFirstName(java.lang.String firstName) {
this.firstName = firstName;
}
public java.lang.String getLastName() {
return lastName;
}
public void setLastName(java.lang.String lastName) {
this.lastName = lastName;
}
public java.lang.String getAddress1() {
return address1;
}
public void setAddress1(java.lang.String address1) {
this.address1 = address1;
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 39
public java.lang.String getAddress2() {
return address2;
}
public void setAddress2(java.lang.String address2) {
this.address2 = address2;
}
public java.lang.String getCity() {
return city;
}
public void setCity(java.lang.String city) {
this.city = city;
}
public java.lang.String getState() {
return state;
}
public void setState(java.lang.String state) {
this.state = state;
}
public java.lang.String getZip() {
return zip;
}
public void setZip(java.lang.String zip) {
this.zip = zip;
}
public java.lang.String getCustomerID() {
return customerID;
}
public void setCustomerID(java.lang.String id) {
this.customerID = id;
}
}
Customer オブジェクト (Java)
package CachePerf;
import java.util.Date;
public class Customer implements java.io.Serializable
{
private static final long serialVersionUID = 1L;
private int customerId;
private java.lang.String contactFirstName;
private java.lang.String contactLastName;
private java.lang.String contactPhone;
private Date lastActivityDate;
private java.lang.String creditCardNumber;
private java.lang.String creditCardExpirationDate;
private Address billingAddress;
private Address shippingAddress;
public Customer() {
}
public int getCustomerId() {
return customerId;
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 40
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public java.lang.String getContactFirstName() {
return contactFirstName;
}
public void setContactFirstName(java.lang.String contactFirstName) {
this.contactFirstName = contactFirstName;
}
public java.lang.String getContactLastName() {
return contactLastName;
}
public void setContactLastName(java.lang.String contactLastName) {
this.contactLastName = contactLastName;
}
public java.lang.String getContactPhone() {
return contactPhone;
}
public void setContactPhone(java.lang.String contactPhone) {
this.contactPhone = contactPhone;
}
public Date getLastActivityDate() {
return lastActivityDate;
}
public void setLastActivityDate(Date lastActivityDate) {
this.lastActivityDate = lastActivityDate;
}
public java.lang.String getCreditCardNumber() {
return creditCardNumber;
}
public void setCreditCardNumber(java.lang.String creditCardNumber) {
this.creditCardNumber = creditCardNumber;
}
public java.lang.String getCreditCardExpirationDate() {
return creditCardExpirationDate;
}
public void setCreditCardExpirationDate(java.lang.String
creditCardExpirationDate) {
this.creditCardExpirationDate = creditCardExpirationDate;
}
public Address getBillingAddress() {
return billingAddress;
}
public void setBillingAddress(Address billingAddress) {
this.billingAddress = billingAddress;
}
public Address getShippingAddress() {
return shippingAddress;
}
public void setShippingAddress(Address shippingAddress) {
this.shippingAddress = shippingAddress;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 41
}
}
Order オブジェクト (Java)
package CachePerf;
import java.util.Date;
public class Order
{
implements java.io.Serializable
private static final long serialVersionUID = 1L;
private String orderId;
private int orderStatus;
private Date orderDate;
private float orderTotalAmount;
private Customer customer;
private LineItem[] lineItems;
public Order()
{
}
public String getOrderId()
{
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public int getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(int orderStatus) {
this.orderStatus = orderStatus;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
public float getOrderTotalAmount() {
return orderTotalAmount;
}
public void setOrderTotalAmount(float orderTotalAmount) {
this.orderTotalAmount = orderTotalAmount;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public LineItem[] getLineItems() {
return lineItems;
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 42
public void setLineItems(LineItem[] lineItems) {
this.lineItems = lineItems;
}
}
LineItem オブジェクト (Java)
package CachePerf;
public class LineItem implements java.io.Serializable
{
private static final long serialVersionUID = 1L;
private String orderId;
private int itemId;
private int productId;
private java.lang.String productDescription;
private int orderQuantity;
private float unitPrice;
public LineItem() {
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
public java.lang.String getProductDescription() {
return productDescription;
}
public void setProductDescription(java.lang.String productDescription) {
this.productDescription = productDescription;
}
public int getOrderQuantity() {
return orderQuantity;
}
public void setOrderQuantity(int orderQuantity) {
this.orderQuantity = orderQuantity;
}
public float getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(float unitPrice) {
this.unitPrice = unitPrice;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 43
}
}
Address オブジェクト (C#)
using System;
[Serializable]
public class Address
{
private string
private string
private string
private string
private string
private string
private string
firstName;
lastName;
address1;
address2;
city;
state;
zip;
public Address()
{
}
public Address(string firstName, string lastName, string address1, string
address2, string city, string state, string zip)
{
this.firstName = firstName;
this.lastName = lastName;
this.address1 = address1;
this.address2 = address2;
this.city = city;
this.state = state;
this.zip = zip;
}
public string FirstName
{
get { return this.firstName; }
set { this.firstName = value; }
}
public string LastName
{
get { return this.lastName; }
set { this.lastName = value; }
}
public string Address1
{
get { return this.address1; }
set { this.address1 = value; }
}
public string Address2
{
get { return this.address2; }
set { this.address2 = value; }
}
public string City
{
get { return this.city; }
set { this.city = value; }
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 44
public string State
{
get { return this.state; }
set { this.state = value; }
}
public string Zip
{
get { return this.zip; }
set { this.zip = value; }
}
}
Customer オブジェクト (C#)
using System;
using System.Runtime.Serialization;
[Serializable]
public class Customer
{
private int customerId;
private string contactFirstName;
private string contactLastName;
private string contactPhone;
private DateTime lastActivityDate;
private string creditCardNumber;
private string creditCardExpirationDate;
private Address billingAddress;
private Address shippingAddress;
public Customer()
{
}
public Customer(int customerId, string firstName, string lastName, string phone,
DateTime lastActivityDate, string creditCardNumber, string creditCardExpirationDate, Address
billingAddress, Address shippingAddress)
{
this.customerId = customerId;
this.contactFirstName = firstName;
this.contactLastName = lastName;
this.contactPhone = phone;
this.lastActivityDate = lastActivityDate;
this.creditCardNumber = creditCardNumber;
this.creditCardExpirationDate = creditCardExpirationDate;
this.billingAddress = billingAddress;
this.shippingAddress = shippingAddress;
}
public int CustomerId
{
get { return this.customerId; }
set { this.customerId = value; }
}
public string ContactFirstName
{
get { return this.contactFirstName; }
set { this.contactFirstName = value; }
}
public string ContactLastName
{
get { return this.contactLastName; }
set { this.contactLastName = value; }
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 45
public string ContactPhone
{
get { return this.contactPhone; }
set { this.contactPhone = value; }
}
public DateTime LastActivityDate
{
get { return this.lastActivityDate; }
set { this.lastActivityDate = value; }
}
public string CreditCardNumber
{
get { return this.creditCardNumber; }
set { this.creditCardNumber = value; }
}
public string CreditCardExpirationDate
{
get { return this.creditCardExpirationDate; }
set { this.creditCardExpirationDate = value; }
}
public Address BillingAddress
{
get { return this.billingAddress; }
set { this.billingAddress = value; }
}
public Address ShippingAddress
{
get { return this.shippingAddress; }
set { this.shippingAddress = value; }
}
}
Order オブジェクト (C#)
using System;
using System.Runtime.Serialization;
[Serializable]
public class Order
{
private
private
private
private
private
private
string orderId;
int orderStatus;
DateTime orderDate;
float orderTotalAmount;
Customer customer;
LineItem[] lineItems;
public Order()
{
}
public Order(string orderId, int orderStatus, DateTime orderDate, float
orderTotalAmount, Customer customer, LineItem[] lineItems)
{
this.orderId = orderId;
this.orderStatus = orderStatus;
this.orderDate = orderDate;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 46
this.orderTotalAmount = orderTotalAmount;
this.customer = customer;
this.lineItems = lineItems;
}
public string OrderId
{
get { return this.orderId; }
set { this.orderId = value; }
}
public int OrderStatus
{
get { return this.orderStatus; }
set { this.orderStatus = value; }
}
public DateTime OrderDate
{
get { return this.orderDate; }
set { this.orderDate = value; }
}
public float OrderTotalAmount
{
get { return this.orderTotalAmount; }
set { this.orderTotalAmount = value; }
}
public Customer Customer
{
get { return this.customer; }
set { this.customer = value; }
}
public LineItem[] LineItems
{
get { return this.lineItems; }
set { this.lineItems = value; }
}
}
LineItem オブジェクト (C#)
using System;
using System.Runtime.Serialization;
[Serializable]
public class LineItem
{
private string orderId;
private int itemId;
private int productId;
private string productDescription;
private int orderQuantity;
private float unitPrice;
public LineItem()
{
}
public LineItem(string orderId, int itemId, int productId, string
productDescription, int qty, float unitPrice)
{
this.orderId = orderId;
this.itemId = itemId;
this.productId = productId;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 47
this.productDescription = productDescription;
this.orderQuantity = qty;
this.unitPrice = unitPrice;
}
public string OrderId
{
get { return this.orderId; }
set { this.orderId = value; }
}
public int ItemId
{
get { return this.itemId; }
set { this.itemId = value; }
}
public int ProductId
{
get { return this.productId; }
set { this.productId = value; }
}
public string ProductDescription
{
get { return this.productDescription; }
set { this.productDescription = value; }
}
public int OrderQuantity
{
get { return this.orderQuantity; }
set { this.orderQuantity = value; }
}
public float UnitPrice
{
get { return this.unitPrice; }
set { this.unitPrice = value; }
}
}
アプリケーション サーブレット (Java)
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
javax.servlet.*;
javax.servlet.http.*;
java.io.IOException;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
CachePerf.*;
com.ibm.websphere.objectgrid.*;
com.ibm.websphere.objectgrid.config.BackingMapConfiguration;
com.ibm.websphere.objectgrid.config.ObjectGridConfigFactory;
com.ibm.websphere.objectgrid.config.ObjectGridConfiguration;
com.ibm.websphere.objectgrid.config.Plugin;
com.ibm.websphere.objectgrid.config.PluginType;
com.ibm.websphere.objectgrid.em.EntityManager;
com.ibm.websphere.objectgrid.server.CatalogServerProperties;
public class App extends HttpServlet
{
private static final long serialVersionUID = 1L;
public static ObjectGridManager ogm;
public static ObjectGrid grid;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 48
public void init(ServletConfig config) throws ServletException
{
super.init(config);
java.util.Enumeration en = config.getInitParameterNames();
while ( en.hasMoreElements() )
{
String parm = (String) en.nextElement();
String value = config.getInitParameter(parm);
}
ObjectGridManager ogm = ObjectGridManagerFactory.getObjectGridManager();
try
{
System.out.println("In Init");
// Obtain a distributed ObjectGrid using ObjectGridManager and
providing
// the ClientClusterContext.
ObjectGridConfiguration companyGridConfig =
ObjectGridConfigFactory.createObjectGridConfiguration("Grid");
BackingMapConfiguration customerMapConfig =
ObjectGridConfigFactory.createBackingMapConfiguration("CUSTOMERS");
//Disable clientside near cache for all backing maps with numbuckets to
0 using client override.
customerMapConfig.setNumberOfBuckets(0);
Plugin evictorPlugin =
ObjectGridConfigFactory.createPlugin(PluginType.EVICTOR,"com.ibm.websphere.objectgrid.plugins.
builtins.LRUEvictor");
customerMapConfig.addPlugin(evictorPlugin);
BackingMapConfiguration orderMapConfig =
ObjectGridConfigFactory.createBackingMapConfiguration("ORDERS");
orderMapConfig.setNumberOfBuckets(0);
orderMapConfig.addPlugin(evictorPlugin);
BackingMapConfiguration addressMapConfig =
ObjectGridConfigFactory.createBackingMapConfiguration("ADDRESS");
addressMapConfig.setNumberOfBuckets(0);
addressMapConfig.addPlugin(evictorPlugin);
companyGridConfig.addBackingMapConfiguration(customerMapConfig);
companyGridConfig.addBackingMapConfiguration(orderMapConfig);
companyGridConfig.addBackingMapConfiguration(addressMapConfig);
List ogConfigs = new ArrayList();
ogConfigs.add(companyGridConfig);
Map overrideMap = new HashMap();
overrideMap.put(CatalogServerProperties.DEFAULT_DOMAIN, ogConfigs);
ogm.setOverrideObjectGridConfigurations(overrideMap);
ClientClusterContext ccc = ogm.connect("France:2809", null, null);
grid = ogm.getObjectGrid(ccc, "Grid");
System.out.println("Remote Grid Connected");
}
catch(Exception e)
{
throw new ServletException(e.toString());
}
}
public java.lang.String getServletInfo()
{
return "Interface to CachePerf";
}
public void performTask(HttpServletRequest req, HttpServletResponse resp) throws
Exception
{
Session session = null;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 49
String action = null;
String orderID = null;
String customerID = null;
String results=null;
resp.setContentType("text/html");
ServletContext ctx = getServletConfig().getServletContext();
action = req.getParameter("action");
orderID = req.getParameter("orderid");
int startid = Integer.parseInt(orderID);
customerID = req.getParameter("customerid");
String size= req.getParameter("size");
Order order =null;
Customer customer;
Address address;
int numItems = Integer.parseInt(size);
if (!action.toLowerCase().equals("nocache"))
{
try
{
session = grid.getSession();
ObjectMap orderMap = session.getMap("ORDERS");
ObjectMap customerMap = session.getMap("CUSTOMERS");
ObjectMap addressMap = session.getMap("ADDRESS");
//*** Following 3 lines used (uncommented) when running with
byte array serialization only!
orderMap.setCopyMode(CopyMode.COPY_TO_BYTES, null);
customerMap.setCopyMode(CopyMode.COPY_TO_BYTES, null);
addressMap.setCopyMode(CopyMode.COPY_TO_BYTES, null);
OrderBL BL = new OrderBL();
session.begin();
address = (Address)getCacheAddress(addressMap,customerID);
if (address==null)
{
address = BL.GetAddress(customerID);
insertCacheAddress(addressMap, customerID,address);
session.commit();
session.begin();
}
customer = Customer)getCacheCustomer(customerMap,customerID);
if (customer==null)
{
customer = BL.GetCustomer(customerID,address);
insertCacheCustomer(customerMap, customerID,customer);
}
session.commit();
session.begin();
for (int i=startid; i<startid+5; i++)
{
order =
(Order)getCacheOrder(orderMap,String.valueOf(i));
if (order==null)
{
order = BL.GetOrder(String.valueOf(i), customer,
numItems, action);
insertCacheOrder(orderMap,
String.valueOf(i),order);
session.commit();
session.begin();
}
}
session.commit();
session.begin();
removeCache(orderMap,orderID);
session.commit();
}
catch (Exception e)
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 50
{
if (session.isTransactionActive())
session.rollback();
throw new ServletException("Exception!!",e);
}
}
else
{
OrderBL BL = new OrderBL();
address = BL.GetAddress(customerID);
customer = BL.GetCustomer(customerID,address);
for (int i=startid; i< startid+5; i++)
{
order = BL.GetOrder(String.valueOf(i), customer, numItems,
action);
}
}
if (order!=null)
req.setAttribute("order", order);
req.setAttribute("action", action);
req.setAttribute("results", results);
requestDispatch(ctx, req, resp, orderID, "Test.jsp");
return;
}
private void insertCacheOrder(ObjectMap map, String key, Order order) throws Exception
{
try
{
map.insert(order.getOrderId(), order);
}
catch (Exception e)
{
throw e;
}
}
private void insertCacheCustomer(ObjectMap map, String key, Customer customer) throws
Exception
{
try
{
map.insert(key, customer);
}
catch (Exception e)
{
throw e;
}
}
private void insertCacheAddress(ObjectMap map, String key, Address address) throws Exception
{
try
{
map.insert(key, address);
}
catch (Exception e)
{
throw e;
}
}
private Order getCacheOrder(ObjectMap map, String key) throws Exception
{
Order value = null;
try
{
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 51
value = (Order)map.get(key);
}
catch (Exception e)
{
throw e;
}
return value;
}
private Customer getCacheCustomer(ObjectMap map, String key) throws Exception
{
Customer value = null;
try
{
value = (Customer)map.get(key);
}
catch (Exception e)
{
throw e;
}
return value;
}
private Address getCacheAddress(ObjectMap map, String key) throws Exception
{
Address value = null;
try
{
value = (Address)map.get(key);
}
catch (Exception e)
{
throw e;
}
return value;
}
private void removeCache(ObjectMap map, String key) throws Exception
{
try
{
map.remove(key);
}
catch (Exception e)
{
throw e;
}
}
private void requestDispatch(ServletContext ctx,
HttpServletRequest req,
HttpServletResponse resp,
String orderID,
String page)
throws ServletException, IOException
{
ctx.getRequestDispatcher(page).include(req, resp);
}
private void sendRedirect(HttpServletResponse resp, String page) throws ServletException,
IOException
{
resp.sendRedirect(resp.encodeRedirectURL(page));
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 52
public void doGet(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws ServletException, IOException
{
try
{
performTask(request,response);
}
catch (Exception e)
{
e.printStackTrace();
throw new ServletException(e);
}
}
public void doPost(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws ServletException, IOException
{
try
{
performTask(request,response);
}
catch (Exception e)
{
throw new ServletException(e);
}
}
}
Test.aspx (C#)
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.UI;
System.Web.UI.WebControls;
Microsoft.ApplicationServer.Caching;
System.Runtime.Serialization;
public partial class Test : System.Web.UI.Page
{
public Order order;
public Customer customer;
public Address address;
public string action =null;
public string customerid=null;
public string orderid=null;
public string size=null;
public int numItems;
protected void Page_Load(object sender, EventArgs e)
{
action = (string) Request["action"];
orderid = (string) Request["orderid"];
int startid = Int32.Parse(orderid);
customerid = (string) Request["customerid"];
size= (string)Request["size"];
int numItems = Int32.Parse(size);
if (action!="nocache")
{
try
{
MyCache theCache = new MyCache();
DataCache orderCache = theCache.getOrderCache();
DataCache addressCache = theCache.getAddressCache();
DataCache customerCache = theCache.getCustomerCache();
OrderBL BL = new OrderBL();
address = (Address)getCacheAddress(addressCache, customerid);
if (address == null)
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 53
{
address = BL.GetAddress(customerid);
insertCacheAddress(addressCache, customerid, address);
}
customer = (Customer)getCacheCustomer(customerCache, customerid);
if (customer == null)
{
customer = BL.GetCustomer(customerid, address);
insertCacheCustomer(customerCache, customerid, customer);
}
for (int i = startid; i < startid + 5; i++)
{
order = (Order)getCacheOrder(orderCache, i.ToString());
if (order == null)
{
order = BL.GetOrder(i.ToString(), customer, numItems);
insertCacheOrder(orderCache, i.ToString(), order);
}
}
removeCache(orderCache, orderid);}
catch (Exception ee){throw ee;
}
}
else
{
OrderBL BL = new OrderBL();
address = BL.GetAddress(customerid);
customer = BL.GetCustomer(customerid, address);
for (int i = startid; i < startid + 5; i++)
{
order = BL.GetOrder(i.ToString(), customer, numItems);
}
}
}
private Address getCacheAddress(DataCache cache, string key)
{
Address value = null;
try
{
value = (Address)cache.Get(key);
}
catch (Exception e)
{
throw e;
}
return value;
}
private Order getCacheOrder(DataCache cache, string key)
{
Order value = null;
try
{
value = (Order)cache.Get(key);
}
catch (Exception e)
{
throw e;
}
return value;
}
private Customer getCacheCustomer(DataCache cache, string key)
{
Customer value = null;
try
{
value = (Customer)cache.Get(key);
}
catch (Exception e)
{
throw e;
}
return value;
}
private void insertCacheCustomer(DataCache cache, string key, Customer customer)
{
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 54
try
{
cache.Put(key, customer);
}
catch (Exception e)
{
throw e;
}
return;
}
private void insertCacheAddress(DataCache cache, string key, Address address)
{
try
{
cache.Put(key, address);
}
catch (Exception e)
{
throw e;
}
return;
}
private void insertCacheOrder(DataCache cache, string key, Order order)
{
try
{
cache.Put(key, order);
}
catch (Exception e)
{
throw e;
}
}
private void removeCache(DataCache cache, string key)
{
try
{
cache.Remove(key);
}
catch (Exception e)
{
throw e;
}
}
}
OrderBL (Java)
package CachePerf;
import
import
import
import
import
import
import
import
import
java.util.*;
javax.naming.Context;
javax.naming.InitialContext;
javax.sql.DataSource;
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.Timestamp;
javax.naming.NamingException;
public class OrderBL
{
private static String dsName = "CACHE";
private static DataSource datasource = null;
private static final String getAddress = "select * from ADDRESS where CUSTOMERID = ?";
private static final String getLineItems ="select * from LINEITEM where ORDERID = ?";
private static final String getCustomer = "select * from CUSTOMER where CUSTOMERID
= ?";
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 55
private static final String getOrder =
"select * from THEORDERS where ORDERID = ?";
private static final String insertAddress = "insert into ADDRESS " + "( CUSTOMERID,
FIRSTNAME,LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP ) " +
"VALUES ( ? , ? , ? , ? , ? , ? ,?,?)";
private static final String insertCustomer = "insert into CUSTOMER " + "( CUSTOMERID,
CONTACTFIRSTNAME,CONTACTLASTNAME, CONTACTPHONE,LASTACTIVITYDATE, CREDITCARDNUMBER,
CREDITCARDEXPIRATIONDATE) " +
"VALUES ( ? , ? , ? , ? , ? , ? ,?)";
private static final String insertOrder = "insert into THEORDERS " + "( ORDERID,
ORDERSTATUS,ORDERDATE, ORDERTOTALAMOUNT,CUSTOMERID) " +
"VALUES ( ? , ? , ? , ? , ? )";
private static final String insertLineItem = "insert into LINEITEM " + "( ORDERID,
ITEMID,PRODUCTID, PRODUCTDESCRIPTION,ORDERQUANTITY, UNITPRICE) " +
"VALUES ( ? , ? , ? , ? , ? , ?)";
public OrderBL()
{
}
private void releaseConn(Connection conn) throws Exception
{
try
{
if (conn != null)
{
conn.close();
}
}
catch (Exception e)
{
throw e;
}
}
private static Context getInitialContext() throws NamingException
{
java.util.Properties parms = new java.util.Properties();
parms.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
Context ctx = new InitialContext(parms);
return ctx;
}
private void getDataSource() throws Exception
{
Context ctx = getInitialContext();
datasource = (javax.sql.DataSource)ctx.lookup(dsName);
}
private Connection getConn() throws Exception
{
Connection conn = null;
if (datasource == null)
getDataSource();
conn = datasource.getConnection();
conn.setAutoCommit(false);
return conn;
}
private void commit(Connection conn) throws Exception
{
conn.commit();
}
private void rollBack(Connection conn, Exception e) throws Exception
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 56
{
conn.rollback();
}
private PreparedStatement getStatement(Connection conn, String sql) throws Exception
{
return conn.prepareStatement(sql);
}
public Address getAddressDB(String customerID) throws Exception
{
Address address = null;
Connection conn = null;
try
{
conn = getConn();
address = getAdressData(conn, customerID);
commit(conn);
}
catch (Exception e)
{
rollBack(conn,e);
throw e;
}
finally
{
releaseConn(conn);
}
return address;
}
private Address getAdressData(Connection conn, String customerID) throws Exception
{
Address address = null;
try
{
PreparedStatement stmt = getStatement(conn, getAddress);
stmt.setInt(1, Integer.parseInt(customerID));
ResultSet rs = stmt.executeQuery();
address = getAddressFromResultSet(conn,customerID, rs);
rs.close();
stmt.close();
}
catch (Exception e)
{
throw e;
}
return address;
}
private Address insertAddress(Connection conn, String customerID,Address address)
throws Exception
{
try
{
PreparedStatement stmt = getStatement(conn, insertAddress);
stmt.setInt(1, Integer.parseInt(customerID));
stmt.setString(2, address.getFirstName());
stmt.setString(3, address.getLastName());
stmt.setString(4, address.getAddress1());
stmt.setString(5, address.getAddress2());
stmt.setString(6, address.getCity());
stmt.setString(7, address.getState());
stmt.setString(8, address.getZip());
stmt.executeUpdate();
stmt.close();
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 57
catch (Exception e)
{
throw e;
}
return address;
}
private Address getAddressFromResultSet(Connection conn, String customerID, ResultSet
rs) throws Exception
{
Address address = null;
address = new Address();
if (!rs.next())
{
address = CreateAddress(Integer.parseInt(customerID));
insertAddress(conn, customerID, address );
}
else
{
address.setAddress1(rs.getString("ADDRESS1"));
address.setAddress2(rs.getString("ADDRESS2"));
address.setCity("CITY");
address.setCity("STATE");
address.setCity("ZIP");
address.setFirstName("FIRSTNAME");
address.setFirstName("LASTNAME");
}
return address;
}
public Customer getCustomerDB(String customerID, Address address) throws Exception
{
Customer customer = null;
Connection conn = null;
try
{
conn = getConn();
customer = getCustomerData(conn, customerID, address);
commit(conn);
}
catch (Exception e)
{
rollBack(conn,e);
throw e;
}
finally
{
releaseConn(conn);
}
return customer;
}
private Customer getCustomerData(Connection conn, String customerID, Address address)
throws Exception
{
Customer customer = null;
try
{
PreparedStatement stmt = getStatement(conn, getCustomer);
stmt.setInt(1, Integer.parseInt(customerID));
ResultSet rs = stmt.executeQuery();
customer = getCustomerFromResultSet(conn,customerID, address, rs);
rs.close();
stmt.close();
}
catch (Exception e)
{
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 58
throw e;
}
return customer;
}
private Customer getCustomerFromResultSet(Connection conn, String customerID, Address
address,ResultSet rs) throws Exception
{
Customer customer = null;
customer = new Customer();
if (!rs.next())
{
customer = CreateCustomer(Integer.parseInt(customerID), address);
insertCustomer(conn, customerID, customer );
}
else
{
customer.setCustomerId(Integer.parseInt(customerID));
customer.setContactFirstName(rs.getString("CONTACTFIRSTNAME"));
customer.setContactLastName(rs.getString("CONTACTLASTNAME"));
customer.setContactPhone(rs.getString("CONTACTPHONE"));
Date lastDate = rs.getTimestamp("LASTACTIVITYDATE");
customer.setLastActivityDate(lastDate);
customer.setCreditCardExpirationDate(rs.getString("CREDITCARDEXPIRATIONDATE"));
customer.setCreditCardNumber(rs.getString("CREDITCARDNUMBER"));
customer.setBillingAddress(address);
customer.setShippingAddress(address);
}
return customer;
}
private Customer insertCustomer(Connection conn, String customerID, Customer
customer) throws Exception
{
try
{
PreparedStatement stmt = getStatement(conn, insertCustomer);
stmt.setInt(1, Integer.parseInt(customerID));
stmt.setString(2, customer.getContactFirstName());
stmt.setString(3, customer.getContactLastName());
stmt.setString(4, customer.getContactPhone());
Timestamp creationDate = new Timestamp(System.currentTimeMillis());
stmt.setTimestamp(5, creationDate);
stmt.setString(6, customer.getCreditCardNumber());
stmt.setString(7, customer.getCreditCardExpirationDate());
stmt.executeUpdate();
stmt.close();
}
catch (Exception e)
{
throw e;
}
return customer;
}
public Order getOrderDB(String orderID,Customer customer, int numberOfLineItems)
throws Exception
{
Order order = null;
try
{
order = getOrderData(orderID, customer, numberOfLineItems);
}
catch (Exception e)
{
throw e;
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 59
return order;
}
private Order getOrderData(String orderID, Customer customer, int numItems) throws
Exception
{
LineItem[] lineItems;
Order order = null;
Connection conn = getConn();
try
{
PreparedStatement stmt2 = getStatement(conn, getLineItems);
stmt2.setInt(1, Integer.parseInt(orderID));
ResultSet rs2 = stmt2.executeQuery();
lineItems = getLinesFromResultSet(conn,orderID, numItems, rs2);
rs2.close();
stmt2.close();
conn.commit();
PreparedStatement stmt = getStatement(conn, getOrder);
stmt.setInt(1, Integer.parseInt(orderID));
ResultSet rs = stmt.executeQuery();
order = getOrderFromResultSet(conn,orderID, customer,lineItems, rs);
rs.close();
stmt.close();
conn.commit();
}
catch (Exception e)
{
conn.rollback();
throw e;
}
finally
{
releaseConn(conn);
}
return order;
}
private LineItem[] getLinesFromResultSet(Connection conn, String orderID, int
numberOfLineItems, ResultSet rs) throws Exception
{
LineItem[] lineItems = new LineItem[numberOfLineItems];
LineItem item = null;
int index = 0;
while (rs.next())
{
item = new LineItem();
item.setOrderId(orderID);
item.setItemId(index);
item.setOrderQuantity(rs.getInt("ORDERQUANTITY"));
item.setProductDescription(rs.getString("PRODUCTDESCRIPTION"));
item.setProductId(rs.getInt("PRODUCTID"));
item.setUnitPrice(rs.getFloat("UNITPRICE"));
if (index<numberOfLineItems)
lineItems[index] = item;
index++;
}
rs.close();
if (index==0)
{
try
{
for (int i=0; i<numberOfLineItems; i++)
{
item = new LineItem();
item.setItemId(i);
item.setProductId(i);
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 60
item.setOrderId(orderID);
item.setOrderQuantity(5);
item.setProductDescription("Product " + String.valueOf(i) );
item.setUnitPrice(5);
insertLineItem(conn, orderID, item );
lineItems[i] = item;
}
}
catch (Exception e)
{
throw e;
}
}
return lineItems;
}
private Order getOrderFromResultSet(Connection conn, String orderID, Customer customer,
LineItem[] lineItems, ResultSet rs) throws Exception
{
Order order = null;
order = new Order();
if (!rs.next())
{
order = CreateOrder(orderID, customer, lineItems);
insertOrder(conn, orderID, order );
}
else
{
order.setOrderId(orderID);
order.setCustomer(customer);
Date lastDate = rs.getTimestamp("ORDERDATE");
order.setOrderDate(lastDate);
order.setOrderStatus(rs.getInt("ORDERSTATUS"));
order.setOrderTotalAmount(rs.getFloat("ORDERTOTALAMOUNT"));
order.setLineItems(lineItems);
}
return order;
}
private Order insertOrder(Connection conn, String orderID, Order order) throws
Exception
{
try
{
PreparedStatement stmt = getStatement(conn, insertOrder);
stmt.setInt(1, Integer.parseInt(orderID));
stmt.setInt(2, order.getOrderStatus());
Timestamp creationDate = new Timestamp(System.currentTimeMillis());
stmt.setTimestamp(3, creationDate);
stmt.setFloat(4, order.getOrderTotalAmount());
stmt.setInt(5,order.getCustomer().getCustomerId());
stmt.executeUpdate();
stmt.close();
}
catch (Exception e)
{
throw e;
}
return order;
}
private LineItem insertLineItem(Connection con2, String orderID, LineItem item) throws
Exception
{
try
{
PreparedStatement stmt = getStatement(con2, insertLineItem);
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 61
stmt.setInt(1, Integer.parseInt(orderID));
stmt.setInt(2, item.getItemId());
stmt.setInt(3,item.getProductId());
stmt.setString(4, item.getProductDescription());
stmt.setInt(5,item.getOrderQuantity());
stmt.setFloat(6, item.getUnitPrice());
stmt.execute();
stmt.close();
}
catch (Exception e)
{
throw e;
}
return item;
}
public Address CreateAddress(int customerID)
{
Address address = new Address();
address.setAddress1("Ship StreetAddress " + Integer.toString(customerID));
address.setAddress2("Street Address Line 2 " + Integer.toString(customerID));
address.setCity("City " + Integer.toString(customerID));
address.setFirstName("Ship FirstName " + Integer.toString(customerID));
address.setLastName("Ship LastName " + Integer.toString(customerID));
address.setState("State " + Integer.toString(customerID));
address.setZip("12345");
return address;
}
public Customer CreateCustomer(int customerID, Address address)
{
Customer customer = new Customer();
customer.setBillingAddress(address);
customer.setShippingAddress(address);
customer.setContactFirstName( "FirstName " + Integer.toString(customerID));
customer.setContactLastName("LastName " + Integer.toString(customerID));
customer.setContactPhone("425-882-8080");
customer.setCreditCardExpirationDate("12/12/2012");
customer.setCreditCardNumber("892374389740");
customer.setCustomerId(customerID);
Date now = Calendar.getInstance().getTime();
customer.setLastActivityDate(now);
return customer;
}
public Order CreateOrder(String orderID, Customer customer, LineItem[] lines)
{
Order order = new Order();
order.setCustomer(customer);
order.setLineItems(lines);
Date now = Calendar.getInstance().getTime();
order.setOrderDate(now);
order.setOrderId(orderID);
order.setOrderStatus(1);
order.setOrderTotalAmount((float)50);
return order;
}
public Address GetAddress(String customerID) throws Exception
{
Address address = getAddressDB(customerID);
return address;
}
public Customer GetCustomer(String customerID, Address address) throws Exception
{
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 62
Customer customer = getCustomerDB(customerID, address);
return customer;
}
public Order GetOrder(String orderId, Customer customer, int numberLineItems, String
action) throws Exception
{
Order order = getOrderDB(orderId, customer, numberLineItems);
return order;
}
}
OrderBL (C#)
using
using
using
using
using
System.Collections;
System;
System.Configuration;
System.Data;
System.Data.SqlClient;
/// <summary>
/// Summary description for OrderBL.
/// </summary>
public class OrderBL
{
private const string PARM_CUSTOMERID = "@CustomerId";
private const string PARM_ORDERID = "@OrderId";
private const string PARM_FIRSTNAME = "@FirstName";
private const string PARM_LASTNAME = "@LastName";
private const string PARM_ADDRESS1 = "@Address1";
private const string PARM_ADDRESS2 = "@Address2";
private const string PARM_CITY = "@City";
private const string PARM_STATE = "@State";
private const string PARM_ZIP = "@Zip";
private const string PARM_PHONE = "@Phone";
private const string PARM_LASTACTIVITYDATE = "@ActivityDate";
private const string PARM_CREDITCARDNUMBER = "@CreditCardNumber";
private const string PARM_CREDITCARDEXP = "@CreditCardExp";
private const string PARM_ORDERSTATUS = "@OrderStatus";
private const string PARM_ORDERDATE = "@OrderDate";
private const string PARM_ORDERAMOUNT = "@OrderAmount";
private const string PARM_ITEMID = "@ItemId";
private const string PARM_PRODUCTID = "@ProductId";
private const string PARM_PRODUCTDESC = "@ProductDesc";
private const string PARM_ORDERQTY = "@OrderQty";
private const string PARM_PRICE = "@Price";
private static string
CUSTOMERID=@CustomerId";
private static
ORDERID=@OrderId";
private static string
CUSTOMERID=@CustomerId";
private static string
private static string
FIRSTNAME,LASTNAME, ADDRESS1,
getAddress = "select * from ADDRESS where
string getLineItems = "select * from LINEITEM where
getCustomer = "select * from CUSTOMER where
getOrder = "select * from THEORDERS where ORDERID=@OrderId";
insertDBAddress = "insert into ADDRESS " + "( CUSTOMERID,
ADDRESS2, CITY, STATE, ZIP ) " +
"VALUES ( @CustomerId , @FirstName
@LastName , @Address1 , @Address2 , @City ,@State,@Zip)";
private static string insertDBCustomer = "insert into CUSTOMER " + "( CUSTOMERID,
CONTACTFIRSTNAME,CONTACTLASTNAME, CONTACTPHONE,LASTACTIVITYDATE, CREDITCARDNUMBER,
CREDITCARDEXPIRATIONDATE) " +
"VALUES ( @CustomerId , @FirstName , @LastName , @Phone ,
@ActivityDate , @CreditCardNumber ,@CreditCardExp)";
private static string insertDBOrder = "insert into THEORDERS " + "( ORDERID,
ORDERSTATUS,ORDERDATE, ORDERTOTALAMOUNT,CUSTOMERID) " +
"VALUES ( @OrderId , @OrderStatus , @OrderDate , @OrderAmount ,
@CustomerId )";
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
,
ページ 63
private static string insertDBLineItem = "insert into LINEITEM " + "( ORDERID,
ITEMID,PRODUCTID, PRODUCTDESCRIPTION,ORDERQUANTITY, UNITPRICE) " +
"VALUES ( @OrderId , @ItemId , @ProductId , @ProductDesc
@OrderQty , @Price)";
,
public OrderBL()
{
}
SqlConnection _internalConnection = null;
string CONNSTRING = "server=seattle;database=CACHEDB;user id=sa;password=#####;min
pool size=100;max pool size=200;Connection Timeout=30;";
public void Open(string connString)
{
if (_internalConnection == null)
_internalConnection = new SqlConnection(connString);
if (_internalConnection.State != ConnectionState.Open)
_internalConnection.Open();
}
public void Close()
{
if (_internalConnection!= null &&
_internalConnection.State!=ConnectionState.Closed)
_internalConnection.Close();
}
public Address CreateAddress(int customerID)
{
Address address = new Address();
address.Address1 = "Ship StreetAddress " + customerID.ToString();
address.Address2 = "Street Address Line 2 " + customerID.ToString();
address.City = "City " + customerID.ToString();
address.FirstName = "Ship FirstName " + customerID.ToString();
address.LastName = "Ship LastName " + customerID.ToString();
address.State = "State " + customerID.ToString();
address.Zip = "12345";
return address;
}
public Customer CreateCustomer(int customerID, Address address)
{
Customer customer = new Customer();
customer.BillingAddress = address;
customer.ShippingAddress = address;
customer.ContactFirstName = "FirstName " + customerID.ToString();
customer.ContactLastName = "LastName " + customerID.ToString();
customer.ContactPhone = "425-882-8080";
customer.CreditCardExpirationDate = "12/12/2012";
customer.CreditCardNumber = "892374389740";
customer.CustomerId = customerID;
DateTime now = DateTime.Now;
customer.LastActivityDate = now;
return customer;
}
public Order CreateOrder(String orderID, Customer customer, LineItem[] lines)
{
Order order = new Order();
order.Customer = customer;
order.LineItems = lines;
DateTime now = DateTime.Now;
order.OrderDate = now;
order.OrderId = orderID;
order.OrderStatus = 1;
order.OrderTotalAmount = (float)50;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 64
return order;
}
public Address getAddressDB(String customerID)
{
Address address = null;
SqlTransaction tx =null;
try {
Open(CONNSTRING);
address = getAdressData(_internalConnection, tx, customerID);
if (tx != null)
tx.Commit();
}
catch (Exception e)
{
if (tx != null)
tx.Rollback();
throw e;
}
finally
{
Close();
}
return address;
}
private Address getAdressData(SqlConnection conn, SqlTransaction tx,
string customerID)
{
Address address = null;
try
{
SqlParameter parm1 = new SqlParameter(PARM_CUSTOMERID, SqlDbType.Int);
parm1.Value = Int32.Parse(customerID);
SqlDataReader rdr =
SQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, tx, CommandType.Text,
getAddress, parm1);
if (rdr.Read())
{
address = new Address(rdr.GetString(1), rdr.GetString(2),
rdr.GetString(3),rdr.GetString(4),rdr.GetString(5),rdr.GetString(6),rdr.GetString(7));
rdr.Close();
return address;
}
else
{
rdr.Close();
tx = conn.BeginTransaction();
address = CreateAddress(Int32.Parse(customerID));
insertAddress(conn, tx, address, customerID);
tx.Commit();
tx = null;
return address;
}
}
catch
{
throw;
}
}
public Address GetAddress(string customerID)
{
Address address = getAddressDB(customerID);
return address;
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 65
public Customer getCustomerDB(string customerID, Address address)
{
Customer customer = null;
SqlTransaction tx =null;
try
{
Open(CONNSTRING);
customer = getCustomerData(_internalConnection, tx, customerID, address);
if (tx!=null)
tx.Commit();
}
catch (Exception e)
{
if (tx!=null)
tx.Rollback();
throw e;
}
finally
{
Close();
}
return customer;
}
private Customer getCustomerData(SqlConnection conn, SqlTransaction tx,
string customerID, Address address)
{
Customer customer = null;
try
{
SqlParameter parm1 = new SqlParameter(PARM_CUSTOMERID, SqlDbType.Int);
parm1.Value = Int32.Parse(customerID);
SqlDataReader rdr =
SQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, tx, CommandType.Text,
getCustomer, parm1);
if (rdr.Read())
{
customer = new Customer(rdr.GetInt32(0), rdr.GetString(1),
rdr.GetString(2),rdr.GetString(3),rdr.GetDateTime(4),rdr.GetString(5),rdr.GetString(6),address
,address);
rdr.Close();
return customer;
}
else
{
rdr.Close();
tx = conn.BeginTransaction();
customer = CreateCustomer(Int32.Parse(customerID), address);
insertCustomer(conn, tx, customer, customerID);
tx.Commit();
tx = null;
return customer;
}
}
catch
{
throw;
}
}
public Customer GetCustomer(String customerID, Address address)
{
Customer customer = getCustomerDB(customerID, address);
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 66
return customer;
}
public Order getOrderDB(string orderID, Customer customer, int numItems)
{
Order order = null;
SqlTransaction tx =null;
try
{
Open(CONNSTRING);
order = getOrderData(_internalConnection, tx, orderID, customer,
numItems);
if (tx!=null)
tx.Commit();
}
catch (Exception e)
{
if (tx!=null)
tx.Rollback();
throw e;
}
finally
{
Close();
}
return order;
}
private Order getOrderData(SqlConnection conn, SqlTransaction tx,
string orderID, Customer customer, int numItems)
{
LineItem[] lineItems = new LineItem[numItems];
Order order;
try
{
SqlParameter parm0 = new SqlParameter(PARM_ORDERID, SqlDbType.Int);
parm0.Value = Int32.Parse(orderID);
SqlDataReader rdr0 = SQLHelper.ExecuteReaderSingleParm(_internalConnection, tx,
CommandType.Text, getLineItems, parm0);
int index =0;
while (rdr0.Read())
{
LineItem item = new
LineItem(rdr0.GetInt32(0).ToString(),rdr0.GetInt32(1),rdr0.GetInt32(2),rdr0.GetString(3),rdr0.
GetInt32(4),(float)rdr0.GetDecimal(5));
lineItems[index] = item;
index++;
}
rdr0.Close();
if (index==0)
{
try
{
tx = conn.BeginTransaction();
for (int i=0; i<numItems; i++)
{
LineItem item = new LineItem();
item.ItemId = i;
item.ProductId = i;
item.OrderId = orderID;
item.OrderQuantity = 5;
item.ProductDescription = "Product " + i.ToString();
item.UnitPrice = 5;
insertLineItem(conn, tx, item, orderID);
lineItems[i] = item;
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 67
tx.Commit();
tx = null;
}
catch (Exception e)
{
throw e;
}
}
SqlParameter parm1 = new SqlParameter(PARM_ORDERID, SqlDbType.VarChar,250);
parm1.Value = Int32.Parse(orderID);
SqlDataReader rdr =
SQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, tx, CommandType.Text, getOrder,
parm1);
if (rdr.Read())
{
order = new Order(rdr.GetInt32(0).ToString(), rdr.GetInt32(1),
rdr.GetDateTime(2),(float)rdr.GetDecimal(3),customer,lineItems);
rdr.Close();
return order;
}
else
{
rdr.Close();
tx = conn.BeginTransaction();
order = CreateOrder(orderID,customer,lineItems);
insertOrder(conn,tx, order, orderID);
tx.Commit();
tx = null;
return order;
}
}
catch
{
throw;
}
}
public Order GetOrder(string orderID, Customer customer, int numItems)
{
Order order = getOrderDB(orderID, customer, numItems);
return order;
}
public void insertCustomer(SqlConnection conn, SqlTransaction tx, Customer customer,
string customerID)
{
// Get the parameters from the cache
SqlParameter[] CustomerParms = GetCreateCustomerParameters();
try
{
CustomerParms[0].Value = Int32.Parse(customerID);
CustomerParms[1].Value = customer.ContactFirstName;
CustomerParms[2].Value = customer.ContactLastName;
CustomerParms[3].Value = customer.ContactPhone;
CustomerParms[4].Value = customer.LastActivityDate;
CustomerParms[5].Value = customer.CreditCardNumber;
CustomerParms[6].Value = customer.CreditCardExpirationDate;
SQLHelper.ExecuteScalar(conn, tx, CommandType.Text, insertDBCustomer,
CustomerParms);
return;
}
catch
{
throw;
}
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 68
private static SqlParameter[] GetCreateCustomerParameters()
{
// Get the parameters from the cache
SqlParameter[] parms = SQLHelper.GetCacheParameters(insertDBCustomer);
// If the cache is empty, rebuild the parameters
if (parms == null)
{
parms = new SqlParameter[] {
new SqlParameter(PARM_CUSTOMERID, SqlDbType.Int),
new SqlParameter(PARM_FIRSTNAME, SqlDbType.VarChar,250),
new SqlParameter(PARM_LASTNAME,SqlDbType.VarChar,250),
new SqlParameter(PARM_PHONE, SqlDbType.VarChar,250),
new SqlParameter(PARM_LASTACTIVITYDATE, SqlDbType.DateTime),
new SqlParameter(PARM_CREDITCARDNUMBER, SqlDbType.VarChar,250),
new SqlParameter(PARM_CREDITCARDEXP, SqlDbType.VarChar,250),
};
// Add the parameters to the cached
SQLHelper.CacheParameters(insertDBCustomer, parms);
}
return parms;
}
public void insertOrder(SqlConnection conn, SqlTransaction tx, Order order, string
orderID)
{
// Get the parameters from the cache
SqlParameter[] OrderParms = GetCreateOrderParameters();
try
{
OrderParms[0].Value = orderID;
OrderParms[1].Value = order.OrderStatus;
OrderParms[2].Value = order.OrderDate;
OrderParms[3].Value = order.OrderTotalAmount;
OrderParms[4].Value = order.Customer.CustomerId;
SQLHelper.ExecuteScalar(conn, tx, CommandType.Text, insertDBOrder,
OrderParms);
return;
}
catch
{
throw;
}
}
private static SqlParameter[] GetCreateOrderParameters()
{
// Get the parameters from the cache
SqlParameter[] parms = SQLHelper.GetCacheParameters(insertDBOrder);
// If the cache is empty, rebuild the parameters
if (parms == null)
{
// @OrderId , @OrderStatus , @OrderDate , @OrderAmount , @CustomerId )";
parms = new SqlParameter[] {
new SqlParameter(PARM_ORDERID, SqlDbType.VarChar,250),
new SqlParameter(PARM_ORDERSTATUS, SqlDbType.Int),
new SqlParameter(PARM_ORDERDATE,SqlDbType.DateTime),
new SqlParameter(PARM_ORDERAMOUNT, SqlDbType.Decimal),
new SqlParameter(PARM_CUSTOMERID, SqlDbType.Int)
};
// Add the parameters to the cached
SQLHelper.CacheParameters(insertDBOrder, parms);
}
return parms;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 69
}
public void insertAddress(SqlConnection conn, SqlTransaction tx, Address address,
string customerID)
{
// Get the parameters from the cache
SqlParameter[] AddressParms = GetCreateAddressParameters();
try
{
AddressParms[0].Value = Int32.Parse(customerID);
AddressParms[1].Value = address.FirstName;
AddressParms[2].Value = address.LastName;
AddressParms[3].Value = address.Address1;
AddressParms[4].Value = address.Address2;
AddressParms[5].Value = address.City;
AddressParms[6].Value = address.State;
AddressParms[7].Value = address.Zip;
SQLHelper.ExecuteScalar(conn, tx, CommandType.Text, insertDBAddress,
AddressParms);
return;
}
catch
{
throw;
}
}
private static SqlParameter[] GetCreateAddressParameters()
{
// Get the parameters from the cache
SqlParameter[] parms = SQLHelper.GetCacheParameters(insertDBAddress);
// If the cache is empty, rebuild the parameters
if (parms == null)
{
// @CustomerId , @FirstName , @LastName , @Address1 , @Address2 ,
@City ,@State,@Zip)";
parms = new SqlParameter[] {
new SqlParameter(PARM_CUSTOMERID, SqlDbType.Int),
new SqlParameter(PARM_FIRSTNAME, SqlDbType.VarChar,250),
new SqlParameter(PARM_LASTNAME, SqlDbType.VarChar,250),
new SqlParameter(PARM_ADDRESS1, SqlDbType.VarChar,250),
new SqlParameter(PARM_ADDRESS2, SqlDbType.VarChar,250),
new SqlParameter(PARM_CITY, SqlDbType.VarChar,250),
new SqlParameter(PARM_STATE, SqlDbType.VarChar,250),
new SqlParameter(PARM_ZIP, SqlDbType.VarChar,250)
};
// Add the parameters to the cached
SQLHelper.CacheParameters(insertDBAddress, parms);
}
return parms;
}
public void insertLineItem(SqlConnection conn, SqlTransaction tx, LineItem item,
string orderID)
{
// Get the parameters from the cache
SqlParameter[] LineItemParms = GetCreateLineItemParameters();
try
{
LineItemParms[0].Value = Int32.Parse(orderID);
LineItemParms[1].Value = item.ItemId;
LineItemParms[2].Value = item.ProductId;
LineItemParms[3].Value = item.ProductDescription;
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 70
LineItemParms[4].Value = item.OrderQuantity;
LineItemParms[5].Value = item.UnitPrice;
SQLHelper.ExecuteScalar(conn, tx, CommandType.Text, insertDBLineItem,
LineItemParms);
return;
}
catch
{
throw;
}
}
private static SqlParameter[] GetCreateLineItemParameters()
{
// Get the parameters from the cache
SqlParameter[] parms = SQLHelper.GetCacheParameters(insertDBLineItem);
// If the cache is empty, rebuild the parameters
if (parms == null)
{
//@OrderId , @ItemId , @ProductId , @ProductDesc , @OrderQty ,
@Price)";
parms = new SqlParameter[] {
new SqlParameter(PARM_ORDERID, SqlDbType.VarChar,250),
new SqlParameter(PARM_ITEMID, SqlDbType.Int),
new SqlParameter(PARM_PRODUCTID, SqlDbType.Int),
new SqlParameter(PARM_PRODUCTDESC, SqlDbType.VarChar,250),
new SqlParameter(PARM_ORDERQTY, SqlDbType.Int),
new SqlParameter(PARM_PRICE, SqlDbType.Decimal)
};
// Add the parameters to the cached
SQLHelper.CacheParameters(insertDBLineItem, parms);
}
return parms;
}
}
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 71
付録 C: チューニング パラメーター
WebSphere のチューニング (バージョン 7.0.0.11 64 ビット) – Windows Server 2008
R2
Web コンテナーのサーブレット キャッシュ: オン
セッション状態の有効期限: 5 分 (インプロセス セッション状態)
アクセス ログ: オフ
パフォーマンス モニター インフラストラクチャ: オフ
アプリケーション プロファイル サービス: オフ
診断トレース: オフ
システム出力: オフ
JVM 構成: System.Out printline メッセージを書き込まない
HTTP チャネルの永続要求の最大数 = -1 (無制限)
Web コンテナーの最小スレッド数 = 200
Web コンテナーの最大スレッド数 = 200
ORB の最小スレッド数 = 200
ORB の最大スレッド数 = 200
ORB の参照渡しを有効化
ORB スレッド プールを使用
ORB の最大キャッシュ接続数 = 1024
TCPChannel.DCS の最小スレッド数 = 200
TCPChannel.DCS の最大スレッド数 = 200
既定スレッドの最小数 = 100
既定スレッドの最大数 = 100
プール内の最小 JDBC 接続数 = 100
プール内の最大 JDBC 接続数 = 200
接続プールのステートメント キャッシュ: 100
Java ヒープ サイズ: 最小 2000/最大 2100 MB
セッション タイムアウト: 5 分
最大セッション数: 20,000
セッション数の制限数の超過を許可 (既定)
eXtreme Scale 7.1 のチューニング – Windows Server 2008 R2
サーバーのプロパティ ファイル
traceSpec=*=all=disabled
systemStreamToFileEnabled=true
enableMBeans=true
statsSpec=all=disabled
memoryThresholdPercentage=95
securityEnabled=false
ORB のチューニング
IBM JRE 1.6.0 IBM Windows AMD 64 ビルド pwa6460sr2-20080818_01 (SR2) を実行
com.ibm.CORBA.enableLocateRequest=true
com.ibm.CORBA.ORBCharEncoding=UTF8
com.ibm.CORBA.ForceTunnel=never
com.ibm.CORBA.RequestTimeout=10
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 72
com.ibm.CORBA.ConnectTimeout=10
com.ibm.CORBA.TransportMode=Pluggable
com.ibm.CORBA.ThreadPool.IsGrowable=false
com.ibm.CORBA.ThreadPool.MaximumSize=200
com.ibm.CORBA.ThreadPool.MinimumSize=200
com.ibm.CORBA.ThreadPool.InactivityTimeout=180000
2 台のコンテナー サーバーで、それぞれ 3 つの eXtreme Scale スタンドアロン コンテナー ノードを実行します。各コンテナー
には既定の (-Xgcpolicy:optthruput) ガベージ コレクションを適用します。ヒープごとに 3.333 GB の RAM を割り当てま
す (サーバーあたり合計 10 GB の専用 RAM)。Java の開始には以下を使用します。

"-Xms3333m" "-Xmx3333m"
-Xgcpolicy:optavgpause および -Xgcpolicy:gencon は両方ともテストしましたが、どちらも良い結果は得られませんでし
た。
ヒープ サイズを 2,100 MB にしたカタログ サーバー 1 台が稼働しています。
Deployment.xml ObjectGrid 展開ファイル
(実行するテスト/フェールオーバー構成に応じて、min/maxSyncReplicas が両方とも 0 または 1 に設
定されていることに注意)
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy ../deploymentPolicy.xsd"
xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="Grid">
<mapSet name="mapSet" numberOfPartitions="6" minSyncReplicas="1" maxSyncReplicas="1" >
<map ref="ORDERS"/>
</mapSet>
<mapSet name="mapSet2" numberOfPartitions="6" minSyncReplicas="1" maxSyncReplicas="1" >
<map ref="CUSTOMERS"/>
</mapSet>
<mapSet name="mapSet3" numberOfPartitions="6" minSyncReplicas="1" maxSyncReplicas="1" >
<map ref="ADDRESS"/>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>
ObjectGrid.XML ObjectGrid 構成ファイル
メモ: 標準の Java ベースのシリアル化を使用し、バイト配列を使用しないでテストを実行する場合は、
copyMode="COPY_TO_BYTES" を削除します。
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="Grid">
<backingMap name="ORDERS" copyMode="COPY_TO_BYTES"
numberOfLockBuckets=”50000”
lockStrategy="OPTIMISTIC" evictionTriggers="MEMORY_USAGE_THRESHOLD" />
<backingMap name="CUSTOMERS" copyMode="COPY_TO_BYTES" numberOfLockBuckets=”500”
lockStrategy="OPTIMISTIC"/>
<backingMap name="ADDRESS" copyMode="COPY_TO_BYTES" " numberOfLockBuckets=”500”
lockStrategy="OPTIMISTIC" />
</objectGrid>
</objectGrids>
</objectGridConfig>
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 73
.NET のチューニング
.NET ワーカー プロセス
ラピッド フェール保護: オフ
ping: オフ
ワーカー プロセスのリサイクル: オフ
IIS 7.0 仮想ディレクトリ
認証なし
アクセス ログ: オフ
ADO.NET 接続プール
DB 最大接続数 = 200
DB 最小接続数 = 100
AppFabric クライアント構成ファイル
<dataCacheClient maxConnectionsToServer="100">
<localCache isEnabled="false" sync="TimeoutBased" objectCount="2000000" ttlValue="1000000"/>
<!--(optional) specify cache notifications poll interval
<clientNotification pollInterval="300" /> -->
<hosts>
<host name="France" cachePort="22233"/>
<host name="England" cachePort="22233"/>
</hosts>
<securityProperties mode="None" protectionLevel="None"/>
<transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456"
maxBufferSize="8388608" maxOutputDelay="2" channelInitializationTimeout="60000"
receiveTimeout="600000"/>
</dataCacheClient>
DB2 v9.7 for Windows Server 64 ビット版
ログ ファイル: 15 GB に拡張
ログ: ドライブ アレイ 1 に設定 (アレイ a)
データベース ファイル: ドライブ アレイ 2 (アレイ b)
アプリケーション最大接続数 = 400
SQL Server 2008
ログ ファイル: 15 GB に拡張
ログ: ドライブ アレイ 1 に設定 (アレイ a)
データベース ファイル: ドライブ アレイ 2 (アレイ b)
Microsoft Windows Server AppFabric と IBM WebSphere eXtreme Scale 7.1 のベンチマーク比較レポート
ページ 74