...

Java EE 5 / Java SE 6 1 日本IBMシステムズ・エンジニアリング(株) Webインフラストラクチャー

by user

on
Category: Documents
133

views

Report

Comments

Transcript

Java EE 5 / Java SE 6 1 日本IBMシステムズ・エンジニアリング(株) Webインフラストラクチャー
Java EE 5 / Java SE 6
日本IBMシステムズ・エンジニアリング(株)
Webインフラストラクチャー
植田 佳明 ([email protected])
© 2008 IBM Corporation
1
Disclaimer
WAS
WAS V7
V7 W/S
W/S
当資料で提供する技術情報は、各製品の出荷前コードに基づくものを含みます。
この資料は日本アイ・ビー・エム株式会社ならびに
日本アイ・ビー・エム システムズ・エンジニアリング株式会社の正式なレ
ビューを受けておりません。
当資料は、資料内で説明されている製品の仕様を保証するものではありません。
資料の内容には正確を期するよう注意しておりますが、この資料の内容は2008年
10月現在の情報であり、製品の新しいリリース、PTFなどによって動作、仕様が変
わる可能性があるのでご注意下さい。
今後国内で提供されるリリース情報は、対応する発表レターなどでご確認くださ
い。
WebSphere Application Server V7
Announcement Workshop 2008
#2
© IBM Corporation.
2
Agenda
WAS
WAS V7
V7 W/S
W/S
概要
EJB3.0
JPA (Java Persistence API)
WAS V7でのEJB3.0
Java SE 6
WebSphere Application Server V7
Announcement Workshop 2008
#3
© IBM Corporation.
3
概要
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
#4
© IBM Corporation.
4
Enterprise Javaの歴史
WAS
WAS V7
V7 W/S
W/S
2008
Spring
Hibernate
SDO
Portlets
SCA
2006
BPEL
2003
2001
2000
1998
EJB 1.0
Servlet 2.1
J2EE 1.2
• EJB
• Servlet
• JSP
• JMS
• JavaMail
J2EE 1.3
• EJB
local EJBs
abs. CMP
MDB
• Servlet 2.3
Events
Filters
• JSP
XML
• JAXP
• Connectors
• JAAS
J2EE 1.4
• EJB 2.1
timers
pluggable JMS
• Web Services
Basic SOAP/HTTP
Registry
• JMX Mgmt
• J2EE Deployment
• JACC
Java EE 6
策定中
Java EE 5
• EJB 3
POJO components
POJO persistence
• Web Services
POJO components
protocol independence
JAXB
StAX
• JSF
• JSP
common EL
• Annotations
IoC
Ease of Development
WebSphere Application Server V7
Announcement Workshop 2008
#5
© IBM Corporation.
Java EEとはJava Platform, Enterprise Editionの略でJava言語でエンタープライズ向けアプ
リケーションを構築するためのフレームワーク・APIの総称です。
1999年に初めてJ2EE1.2として策定され、それから1.3、1.4とバージョンアップを重ねてきまし
た。ただ、仕様が複雑で実装も煩雑になる傾向があり(特にEJB)、そのアンチテーゼとして、
SpringやHibernateといった軽量なオープンソースフレームワークが登場してきました。Java EE
5ではそのオープンソースの良い面を取り入れるかたちで、Ease of Development (開発容易
性)ということをキーワードに仕様が策定されています。なお、1.4まではJ2EEと呼ばれていました
が、5.0からはバージョン表記を明確にする目的でJ2EE1.5ではなく、Java EE 5と呼ばれていま
す。
5
WASがサポートするJ2EE
WAS
WAS V7
V7 W/S
W/S
WAS
出荷開始年月(GA)
J2SE
J2EE
7.0
2008/09
Java SE 6
Java EE 5
6.1
2006/06
5.0
1.4
6.0
2004/12
1.4
1.4
5.1
2004/01
1.4
1.3
5.0
2003/01
1.3
1.3
4.0
2001/06
1.3
1.2
3.5
2000/08
1.2
N/A
WebSphere Application Server V7
Announcement Workshop 2008
#6
© IBM Corporation.
各WASのバージョンがサポートするJ2EEのバージョンは上記の表のようになります。Java EE
5の前提のJava SEは5ですが、WAS V7ではJava SE 6を採用しています。J2SEのバージョン
表記も5.0からはJ2SE1.5ではなく、Java SE 5となっています。
6
J2EE 1.4と比較して・・・
WAS
WAS V7
V7 W/S
W/S
Java EE 5 のメインテーマはEoD(開発容易性)
コンポーネントをPOJOとして実装
EJB2.xまでのような開発時の複雑な手続きを省くことを目的としている
アノテーションの使用
コーディング記述量の減少
インターフェースやデプロイメント記述子などの作成物の減少
オープンソースフレームワークによる影響
DI(Dependency Injection)、AOP(Aspect Oriented Programming)
O/Rマッピング
仕様面では以下のような大きな変更がある
EJB3.0
JPA (Java Persistence API)
Webサービス
など
WebSphere Application Server V7
Announcement Workshop 2008
#7
© IBM Corporation.
Java EE 5ではEoD (Ease of Development、開発容易性)というものをキーワードに仕様策定
されており、なるべく開発者にとっての負荷を軽減する工夫が取り入れられています。
そのための工夫として、まず開発コンポーネントをPOJO (Plain Old Java Object) として作成
できることを目的の一つとしています。POJOとは、もともとはMartin Fowler氏らがEJBを批判す
るために使い始めた言葉で、通常のJavaオブジェクトを意味します。つまり特別なインター
フェース実装やクラス継承といった煩雑なお作法を省く形でコーディングすることが可能になっ
ています。また、さまざまな場面でアノテーションを使った記述方法がサポートされており、コー
ディング量の減少や、デプロイメント記述子への設定省略などにつながっています。
Java EE 5は人気を博しているオープンソースフレームワークから大きな影響を受けています。
Spring、HibernateといったオープンソースフレームワークからDI、AOP、O/Rマッピング方式を
その仕様内に取り込んでいます。
実際の仕様面での大きな変更としては、EJBとWebサービスがあげられます。Webサービスに
ついては後続のセッションで詳細を述べることとし、本セッションでは主にEJB3.0 / JPAを中心
にとりあげます。
7
POJOって何だ
POJO = Plain Old Java Object
WAS
WAS V7
V7 W/S
W/S
直訳すると「何の変哲もない古きJavaオブジェクト」
仕様があるわけではないので、正式な定義はないが
Wikipediaより
あるJavaオブジェクトがEJB(特にEJB
あるJavaオブジェクトがEJB(特にEJB3より前のEJB)のように特殊なものではなく、ごく普通の
3より前のEJB)のように特殊なものではなく、ごく普通の
Javaオブジェクトであることを強調した名称。設計はシンプルであればあるほど良いと主張する人
Javaオブジェクトであることを強調した名称。設計はシンプルであればあるほど良いと主張する人
たちが好んで使用する。
たちが好んで使用する。
Contextual
Contextualvariations
variations
As
AsofofNovember
November2005,
2005,the
theterm
term"POJO"
"POJO"isismainly
mainlyused
usedtotodenote
denoteaaJava
Javaobject
objectwhich
whichdoes
does
not
follow
any
of
the
(major)
Java
object
models,
conventions,
or
frameworks
not follow any of the (major) Java object models, conventions, or frameworkssuch
suchas
as
EJB.
EJB.
All
AllJava
Javaobjects
objectsare
arePOJOs,
POJOs,therefore
thereforeideally
ideallyspeaking
speakingaaPOJO
POJOisisaaJava
Javaobject
objectnot
notbound
bound
by
any
restriction
other
than
those
forced
by
the
Java
Language
Specification.
by any restriction other than those forced by the Java Language Specification.I.e.,
I.e.,aa
POJO
POJOshould
shouldnot
nothave
havetoto
1.1.Extend
prespecified
Extend prespecifiedclasses
classes
2.2.Implement
Implementprespecified
prespecifiedinterfaces
interfaces
3.3.Contain
Containprespecified
prespecifiedannotations
annotations
EJB 3.0はアノテーションを使用しているので、「POJO likeな」と言ったほうが正確かもしれません
WebSphere Application Server V7
Announcement Workshop 2008
#8
© IBM Corporation.
前項で、Java EE 5はPOJOをベースとしたコンポーネントモデルを目標としているというお話
をしましたが、「POJO」とは、何でしょうか。POJO (Plain Old Java Object) は、仕様等があって
明確に定義されているわけではありません。もともとは、以前のEJBではないJavaオブジェクトの
ことを強調する言葉として用いられてきました。Wikipedia上でも、文脈によって使い方に相違が
ある言葉として認識位置づけられており、特別なクラスやインターフェースの拡張や実装と、アノ
テーションを含まないと言われています。例えば、EJB 3.0 の開発コンポーネントはアノテーショ
ンを含みますので、「POJO likeな」と言ったほうが正確かもしれません。
ただ、POJOか否かという議論ではなく、簡単に、誤りの無い、コードが書けて、簡単にテストで
きると言うことが重要です。
8
アノテーションとは
WAS
WAS V7
V7 W/S
W/S
ソースコード中でクラス、フィールドなどに対して属性情報を付加
Java SE 5.0で仕様追加
「@」記号で指定
コンテナーがアノテーションを認識して動作
クラス継承やインターフェース実装といったプログラミングのお作法を省略
デプロイメント・ディスクリプターの記述を代替
例 - EJB2.1とEJB3.0でのコーディング比較
EJB3.0ではアノテーションの使用により、お作法的なコーディングが省略される
EJB 2.1
public
publicclass
classCartBean
CartBean
implements
implementsSessionBean
SessionBean{{
private
SessionContext
private SessionContextctx;
ctx;
}}
public
publicint
intsomeShoppingMethod()
someShoppingMethod(){{…
…}}
public
publicvoid
voidejbCreate()
ejbCreate(){{}}
public
publicvoid
voidejbRemove()
ejbRemove(){{}}
public
publicvoid
voidejbActivate()
ejbActivate(){{ }}
public
publicvoid
voidejbPassivate()
ejbPassivate(){{ }}
public
publicvoid
voidsetSessionContext
setSessionContext
(SessionContext
(SessionContextctx)
ctx){{}}
EJB 3.0(アノテーション使用)
@Stateful
@Stateful
public
class CartBean implements
public
class CartBean
implements
ShoppingCart
{
ShoppingCart {
public int someShoppingMethod() { ... }
public int someShoppingMethod() { ... }
}
}
WebSphere Application Server V7
Announcement Workshop 2008
#9
© IBM Corporation.
アノテーションとは、ソースコード中にクラスやメソッドの属性情報を付加する機能です。概念自
体は以前からありましたが、J2SEの文法としてはJ2SE5.0から導入されました。
アノテーションとして記述された属性情報は、コンパイル後もクラスファイル中に残り、それを解釈
するツール(EJBであればコンパイラやEJBコンテナー)と組み合わされ機能を発揮します。
例では、CartBeanクラスについて@StatefulというEJB3.0用のアノテーションを指定していま
す。これをEJBコンテナー上で動かすとコンテナーはStateful Session Beanとして動作させま
す。EJB 2.1までは、特定のインターフェースを実装して、使用する必要のないメソッドもかなら
ずコード中に記述する必要があったため、比較してみるとよりシンプルなコーディングが可能に
なっていることがわかります。
WAS V7 InfoCenter - EJB 3.0 metadata annotations
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/rejb_3annotations.html
9
DIとは
WAS
WAS V7
V7 W/S
W/S
DI (Dependency injection) とは
制御の逆転
クライアントがサービスを呼び出すのではなく、コンテナが実行時にサー
ビスを注入
DIの効果
サービスの柔軟性向上
テスト容易性向上
Java EE 5ではアノテーションを利用してDIを実現
EJB 2.1
Object
Objectobj
obj==
Context.lookup(“java:comp/env/ejb/MyCartHome”);
Context.lookup(“java:comp/env/ejb/MyCartHome”);
CartHome
CartHometheCartHome
theCartHome==(CartHome)
(CartHome)
PortableRemoteObject.narrow(obj,
PortableRemoteObject.narrow(obj,CartHome.class);
CartHome.class);
ShoppingCart
myCart
=
theCartHome.create()
ShoppingCart myCart = theCartHome.create();;
myCart.someShoppingMethod();
myCart.someShoppingMethod();
EJB 3.0
@EJB
@EJB
private
privateShoppingCart
ShoppingCart myCart;
myCart;
public
void
someMethod()
{{
public
void
someMethod()
myCart.someShoppingMethod();
}} myCart.someShoppingMethod();
WebSphere Application Server V7
Announcement Workshop 2008
# 10
© IBM Corporation.
DI (Dependency Injection) の技術はオープンソースフレームワークのSpringなどが最初に導
入した技術です。これは例えばクライアントから使用するオブジェクトを取得する代わりに、実行
時に、必要なオブジェクトをコンテナから注入してもらうという方法をとります。Java EE 5ではアノ
テーションを使用してDIを実現しています。これによってクライアント側はサーバー側の実装に
依存せずに開発を行うことができます。インターフェースさえ定義・遵守されれば、柔軟にサー
バー実装を置き換えることができるようになります。また、テストのときには、Mockオブジェクトを
使用することで、JNDI非依存で簡単にテストを行うことが可能になります。
DIを使用するとコーディングの量も削減されますが、テスト容易性も大きく向上します。
10
EJB3.0
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 11
© IBM Corporation.
11
EJB (Enterprise Java beans) とは
WAS
WAS V7
V7 W/S
W/S
Java EEアプリケーションのビジネスロジック層を担当
ビジネスロジック実装のフレームワークを提供
EJBプログラム(コンポーネント)とコンテナ(フレームワーク)の処
理分担
コンテナはトランザクション管理などの機能を提供
開発者はビジネスロジックを実装するコンポーネントのみを開発
分散環境で利用できる仕組みを提供
Java EEアプリケーション
Webコンテナ
クライアント
ブラウザ
JSP
EJBコンテナ
EJB
DB
Servlet
プレゼンテーション層
ビジネスロジック層
WebSphere Application Server V7
Announcement Workshop 2008
# 12
© IBM Corporation.
EJBはJava EE アプリケーションのビジネスロジック部分を実装するためのフレームワークです。
開発者ビジネスロジックを実装したコンポーネントのみを開発し、EJBコンテナという実行環境上
でその開発コンポーネントを動作させます。EJBコンテナはトランザクション管理など様々な機能
を提供し、EJBコンポーネントはコンテナーの機能を使用します。こういった開発スタイルのため、
開発者はビジネスロジックの実装にのみ注力できます。
また、EJBの大きな特徴としては分散環境での実行を可能にしている点です。これにより、より
柔軟なかたちでシステムを構成することができます。
12
EJB 2.x までは・・・
WAS
WAS V7
V7 W/S
W/S
さまざまな問題点が指摘されていた
EJBを作るのが難しい
本質的なビジネス・ロジックとは関係ない作成物、実装コードが多
い
継承、実装のお作法、APIが複雑
EJB クライアントもコーディングのお作法が複雑
ユニットテストが困難
・・・・・などなど
EJBのアンチテーゼとしてオープンソースフレームワークが台頭
軽量で開発が容易
DI (Dependency Injection)コンテナー、軽量コンテナー
Spring、Seasar2など
O/Rマッピング・フレームワーク
Hibernate、iBATISなど
WebSphere Application Server V7
Announcement Workshop 2008
# 13
© IBM Corporation.
ただし、J2EEのコンポーネントであるServletやJSPが広く普及しているのに対して、EJBはそ
れほど広くは普及していません。
これにはさまざまな原因が考えられ、以下のような問題点が指摘されていました。
まず、EJBは作成手順やAPIが複雑なため開発に手間がかかってしまうという点が挙げられま
す。また、手間をかけて開発したところで、実行してみるとその処理負荷が高く、処理が遅いとい
う点もEJBが普及しない原因といえます。その他にも、アプリケーション・サーバー上でしか動作
しないのでユニットテストが困難である、開発者が作成したコードと自動生成されたコードの関係
が見えにくい、などEJBの普及を妨げるさまざまな要素が挙げられます。
それに対してのアンチテーゼとしてオープンソースフレームワークが台頭してきました。オープ
ンソースフレームワークはビジネスロジック実装にあたってEJBと比較すると軽量で、かつ開発も
しやすく、DIなどアプリケーション全体のアーキテクチャーを考える上でも有利な機能を備えてい
ました。
こういった背景の下、EJB 3.0が登場します。
13
EJB 3.0 の3つのドキュメント
WAS
WAS V7
V7 W/S
W/S
EJB 3.0の仕様
EJB Core Contracts and Requirements
EJBコンテナの実装関連
EJB 3.0 Simplified API
Session/Message Driven BeanのAPI仕様
Java Persistence API
新しい永続化仕様(これまでのEntity Beanに相当)
Entity Classの詳細
WebSphere Application Server V7
Announcement Workshop 2008
# 14
© IBM Corporation.
EJB 3.0は、Java EE 5のメインコンポーネントの1つです。 Java EE 5のベースとなるのは
J2SE 5です。
EJB3.0の仕様書は、Persistence API、EJB3.0 Simplified API、EJB Core Contracts and
Requirementsの3つから構成されています。
EJB Core Contracts and Requirementsでは、EJBコンテナの実装関連について記述されて
おり、アプリケーション開発者よりもJ2EEアプリケーション・サーバーなどといった実行環境の開
発ベンダー向けの仕様書になります。
EJB 3.0 Simplified APIでは、EJBの全体的な仕様やSession Bean、Message Driven
BeanなどといったEntity Bean以外の仕様について記述されています。
Persistence APIでは、新しい永続化仕様であるEntity Classに関する内容が記述されていま
す。
「JSR-000220 Enterprise JavaBeans 3.0 (Final Release)」
http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html
14
EJB 3.0仕様の特徴
WAS
WAS V7
V7 W/S
W/S
純粋なビジネスロジック作成のためのフレームワークへ
仕様において必ずしも分散環境を前提とはしないビジネスアプリケー
ションフレームワークであることをうたっている
EJB2.1で想定していた「分散環境」の枠組みを取り払う
開発容易性
アプリケーション開発者からみた複雑性の排除
JPA (Java Persistence API) の独立
EJB2.1ではEntity BeanとしてEJBの一種として定義されていた
EJB3.0では他のEJBから独立する形で仕様が定義されている
JPA単体でJava SE環境での利用も想定されている
WebSphere Application Server V7
Announcement Workshop 2008
# 15
© IBM Corporation.
EJB 3.0 の仕様では、下記のようにEJBの目的が記述されています。EJB 2.1 の仕様では、1
番目と2番目の項目が、「distributed object-oriented」のように合わせて記述されていたものが、
2つの項目に分割されました。これは、必ずしも分散コンポーネントのみに特化するわけではなく、
ビジネス・ロジックのコンポーネントのフレームワークを提供を目指していることを表しています。
また、後述しますが、EJB 3.0 の主要なアップデートは、アプリケーション開発者の観点からの複
雑性の排除です。
EJB 3.0 (JSR 220: Enterprise JavaBeans,Version 3.0 - EJB Core Contracts and
Requirements) 仕様より
-----------------------------------------------------------The Enterprise JavaBeans (EJB) architecture has the following goals:
• The Enterprise JavaBeans architecture will be the standard component
architecture for building object-oriented business applications in the Java
programming language.
• The Enterprise JavaBeans architecture will be the standard component
architecture for building distributed business applications in the Java
programming language.
-----------------------------------------------------------(参考) EJB 2.1 の仕様でこの2項目にあたる記述
The Enterprise JavaBeans architecture will be the standard component architecture for
building distributed object-oriented business applications in the Java programming
language.
15
EJB の種類
Session Bean, Message Driven Bean
の基本機能は変わらず、EJB 3.0では、
Ease of Developmentを実現
Session Bean
WAS
WAS V7
V7 W/S
W/S
ビジネスロジックを実装
StatelessとStatefulの2つのセッションObject
Message Driven Bean
MOMのキューからメッセージを取り出して、非同期にビジネスロ
ジックを実行
Message
Queue
Entity
EJB 3.0では、JPAで定義されるEntity ClassとEntity Objectに
必ずしもEJBコンテナー上ではなく、J2SE上でも稼動可能
データを永続的に保存するJava Beans
DB
EJB3.0の機能的なアップデートのメインは
JPA (Entity Object)
WebSphere Application Server V7
Announcement Workshop 2008
# 16
© IBM Corporation.
EJBの種類には、上記のように3種類のEJBがあります。EJB 3.0 では、Session Beanと
Message Driven Beanは、これまでと同様の機能を持ちつつ、Ease of Developmentが実現さ
れました。
また、EJB 3.0では、以前のEntity Beanは、JPAという形で新たに仕様が定義され、O/Rマッピ
ングは大きく機能が向上し、開発容易性も大きく向上しています。
16
EJB 3.0 Session Bean
WAS
WAS V7
V7 W/S
W/S
Session Beanはビジネスロジックを実装
BeanクラスとBusinessインターフェースから構成される
Beanクラスにビジネスロジックを記述
Beanクラスは必ず一つのBusinessインターフェースを実装する必要がある
Businessインターフェースは特別なインターフェース継承や例外スローを必要と
しない通常のJavaインターフェース
Businessインターフェースにはクライアントに公開するBeanクラス内のメソッド
を記述
クライアントはBusinessインターフェース経由でメソッドを実行
EJBコンテナ
Webコンテナ
Bean Class
Servlet
EJB3CllientServlet
クラス
OrderTaskインター
フェースを通じて
getCustomer()メソッド
を呼び出す
Business Interface
OrderTask
インターフェース
OrderTaskImpl
クラス
getCustomer()
メソッド
実装
WebSphere Application Server V7
Announcement Workshop 2008
# 17
© IBM Corporation.
ここからはSession Beanをとりあげます。
Session BeanとはEJB3.0の仕様で定義されるEJBの一種で、ビジネスロジックを実装します。
クライアントはリモート(別JVM)あるいはローカル(同一JVM)からその実装した機能を使用するこ
とが可能です。
EJB 3.0ではSession Beanを開発する際には実際にビジネスロジックを記述するBeanクラスと
Beanクラスによって実装されるBusinessインターフェースを作成する必要があります。クライアン
トはBusinessインターフェース経由でロジックを実行します。Businessインターフェースは特別
なインターフェースを実装、継承する必要はなく、通常のJavaインターフェースです。
17
EJB 2.xまでのSession Bean
WAS
WAS V7
V7 W/S
W/S
Beanクラスは2つのインターフェースを実装しなければならない
Homeインターフェース
Session Beanの生成、破棄などのライフサイクルを管理
RemoteインターフェースまたはLocalインターフェース
クライアントに公開するメソッドを記述
クライアントのからのアクセス方式に応じてどちらかのインターフェースを実装
実装上のお作法が複雑
特定のインターフェース継承、実装や例外のスローが必要
EJBコンテナ
Webコンテナ
Home Interface
Servlet
Beanインスタンス生成
OrderTask取得
EJB3CllientServlet
クラス
OrderTaskインター
フェースを通じて
getCustomer()メソッド
を呼び出す
Bean Class
OrderTaskHome OrderTaskImpl
インターフェース
クラス
OrderTask
インターフェース
getCustomer()
メソッド
Remote Interface
WebSphere Application Server V7
Announcement Workshop 2008
# 18
© IBM Corporation.
EJB3.0と2.xを比較してみます。
EJB3.0ではインターフェースは一つでよかったのと比較して、EJB2.xではBeanクラスはHome
インターフェースというBeanインスタンスのライフサイクル管理を定義したインターフェースと実際
にビジネスロジックを記述したRemote (またはLocal) インターフェースの2種類を実装する必要
がありました。その結果、仕組みとしても非常に理解しずらいものとなっていました。
さらに各インターフェースは決まったインターフェースを実装したり、例外のスローが必要で
あったりと、煩雑なコーディングを強いられる傾向にあり、EJBが敬遠される理由のひとつにも
なっていました。
18
コーディング比較(Beanクラス & インターフェース)
WAS
WAS V7
V7 W/S
W/S
3.0ではBusinessインターフェースのみ
Homeインターフェースは必要なし
アノテーションの活用でお作法的なコーディングが簡単に
@Remote、@Local (Businessインターフェース)
@Stateless、@Stateful (Beanクラス)
3.0 Code
2.1 Code
public interface ShoppingCartHome
public interface ShoppingCartHome
extends EJBHome {
extends EJBHome {
ShoppingCart create()
ShoppingCart create()
throws RemoteException,
throws RemoteException,
CreateException;
CreateException;
}
}
Home Interface
public interface ShoppingCart
public interface ShoppingCart
extends EJBObject {
extends EJBObject {
public int someShoppingMethod()
public int someShoppingMethod()
throws RemoteException;
throws RemoteException;
}
}
public class CartBean
public class CartBean
implements SessionBean {
implements SessionBean {
private SessionContext ctx;
private SessionContext ctx;
public int someShoppingMethod() { … }
public int someShoppingMethod() { … }
public void ejbCreate() { }
public void ejbCreate() { }
public void ejbRemove() { }
public void ejbRemove() { }
public void ejbActivate() { }
public void ejbActivate() { }
public void ejbPassivate() { }
public void ejbPassivate() { }
public void setSessionContext
public void setSessionContext
(SessionContext ctx) { }
(SessionContext ctx) { }
}
}
Remote Interface
@Remote
@Remote
public interface ShoppingCart {
public interface ShoppingCart {
public int someShoppingMethod();
public int someShoppingMethod();
}
}
Business Interface
@Stateful
@Stateful
public
class CartBean implements
public
class CartBean
implements
ShoppingCart
{
ShoppingCart {
public int someShoppingMethod() { ... }
public int someShoppingMethod() { ... }
}
}
Enterprise Bean Class
Enterprise Bean Class
WebSphere Application Server V7
Announcement Workshop 2008
# 19
© IBM Corporation.
こちらはコーディングの比較です。
上記の例からも分かりますように、EJB 3.0 では、特別なお作法に惑わされること無く、ビジネ
スロジックを実装しているクラスの作成と、その公開メソッドをそのままインターフェースとして公開
するという非常に素直なコーディングになっています。
また、EJBであることは、アノテーション(@Remoteや@Stateless)を使用して示し、EJB固有
のクラスやインターフェースの継承や実装は必要ありません。
19
コーディング比較(クライアント)
WAS
WAS V7
V7 W/S
W/S
EJB 3.0では
DIを利用してBusinessインターフェースのインスタンスを取得
@EJBアノテーションを利用
JNDIによるlookupも従来どおり利用可能
AppServer
AppServer
JNDI
lookup()
クライ
アント
create()
(or lookup() )
EJBコンテナ
EJBHome
EJBObject
Enterprise
Bean
EJBコンテナ
クライ
アント
目的のメソッド
2.x
2.x Code
Code
Object obj = Context.lookup(“java:comp/env/ejb/MyCartHome”);
Object obj
= Context.lookup(“java:comp/env/ejb/MyCartHome”);
CartHome
theCartHome
= (CartHome)
CartHome
theCartHome = (CartHome) CartHome.class);
PortableRemoteObject.narrow(obj,
PortableRemoteObject.narrow(obj,
CartHome.class);
ShoppingCart myCart = theCartHome.create()
;
ShoppingCart myCart = theCartHome.create() ;
myCart.someShoppingMethod();
myCart.someShoppingMethod();
JNDI
@EJB
Business
Interface
Enterprise
Bean
目的のメソッド
3.0
3.0 Code
Code
@EJB
@EJB ShoppingCart myCart;
private
private ShoppingCart myCart;
public void someMethod() {
public
void someMethod() {
myCart.someShoppingMethod();
myCart.someShoppingMethod();
}
}
WebSphere Application Server V7
Announcement Workshop 2008
# 20
© IBM Corporation.
一方、こちらはクライアント側のコーディング比較です。
EJB 3.0 では、これまでのEJB 2.x のときは、クライアント側のコーディングも変わり、Homeオ
ブジェクトをlookupする必要はありません。直接、Businessインターフェースを実装したインスタ
ンスを取得し、そのメソッドが実行できます。また、Businessインターフェースを実装したインスタ
ンスの取得方法も、コード上でlookupする方法だけでなく、アノテーションを使用したDIで取得
することができます。これにより、非常にシンプルなコーディングでEJB呼び出しを行うことができ
ます。また、アノテーションを使用したDIを利用することにより、EJBサーバー側が完成していなく
ても、簡単にモックオブジェクトを作成・登録できますので、EJBクライアント側のテストも容易に
行うことができます。
20
EJB3.0におけるMessage Driven Bean
WAS
WAS V7
V7 W/S
W/S
アノテーションベースでのコーディングが可能
@MessageDriven
アクティベーション・スペックの設定が可能
@MessageDrivenでMDBであることを宣言
@MessageDriven(
アクティベーション・スペックの設定
name="CreateUsersCardJMSProcessor",
messageListenerInterface="javax.jms.MessageListener"
activationConfig= {
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(
propertyName="destinationName"
propertyValue="jms/CreateUsersRequestQueue")
})
public class CreateUsersCardProcessor{
public void onMessage(javax.jms.Message msg) {
}
}
onMessageメソッド
WebSphere Application Server V7
Announcement Workshop 2008
# 21
© IBM Corporation.
次にEJB3.0でのMessage Driven Bean (MDB) です。
機能的にはEJB2.1からの変更点はほとんどありませんが、EoDの観点からアノテーションを使っ
て、より容易にコーディングすることが可能になっています。
コーディング例では@MessageDrivenというアノテーションを使用しています。
@MessageDrivenアノテーションがあることによってEJBコンテナはこのコンポーネントをMDBと
して取り扱います。
21
トランザクション
WAS
WAS V7
V7 W/S
W/S
EJBのトランザクション実装は管理する主体に応じて2種類存在
CMT(Container Managed Transaction):コンテナー管理
BMT(Bean Managed Transaction):Bean管理(コーディングでトラ
ンザクションを制御)
CMTかBMTかはアノテーションによって指定可能
@TransactionManagementTypeアノテーション
CMTの場合、メソッドごとのトランザクション属性もアノテー
ションで指定できる(@TransactionAttributeアノテーションの
利用)
コンテナー管理のトランザクション
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class EJB3BankBean implements EJB3BankService {
・・・省略・・・
@TransactionAttribute(TransactionAttributeType.REQUIRED)
トランザクション属性は
NOT_SUPPORTED
public Customer getCustomer(String ssn) throws ITSOBankException
{
・・・省略・・・
}
}
WebSphere Application Server V7
Announcement Workshop 2008
# 22
© IBM Corporation.
トランザクションについてもMDBと同じく、EJB2.1から機能的な変更はありませんが、こちらもア
ノテーションを使ってトランザクション機能を利用できるようになっています。
上記はStateless Session Bean内でトランザクションを使用するときのコーディング例です。
@TransactionManagementや@TransactionAttributeアノテーションを使用することにより、トラ
ンザクション管理方法や属性がソースコード内に記述できます。これにより、デプロイメント記述
子への設定を省略することが可能になります。
22
EJB 3.0での新機能 – Interceptor (1/2)
WAS
WAS V7
V7 W/S
W/S
EJB3.0ではAOP(Aspect Oriented Programming) を実現するためにInterceptorと
呼ばれる機能を提供している
AOP (Aspect Oriented Programming)とは
AOPは横断的関心事をクラスの定義から分離し、必要に応じて挿入するという形
をとる
横断的関心事とは中心となるビジネスロジック以外の処理(ロギング、トランザ
クション制御など)で、複数のモジュールに散在するものを言う。
メリット
本質的なビジネスロジック部分の開発を分離できる
ログ処理などの再利用性、変更への耐性が高まる
モジュールA
ログ処理が
散在
モジュールB
モジュールA
AOP
モジュールB
WebSphere Application Server V7
Announcement Workshop 2008
ログ処理
# 23
© IBM Corporation.
EJB3.0の新機能の一つにInterceptorというものがあります。これはAOP (Aspect Oriented
Programming) を可能にする仕組みです。
クラス定義の中には本質的な役割ではなく、複数のクラスに必要とされる役割が入りこんでしま
うことがあります。ロギング処理や、トランザクション中のデータベース接続処理などが代表的で
す。この役割は、「横断的な関心事」と呼ばれます。
AOPとは、この「横断的な関心事」を分離して、各クラスには本質的な役割のみを記述し、必要
に応じて「横断的な関心事」の結びつけを行なうプログラミング方式です。
・AOP指向プログラミングのメリット
クラス定義にはオブジェクトの本質的な役割のみ記述される為、プログラミングがシンプルになり
ます。
横断的な関心毎が分離され纏めて管理出来る為、再利用性・変更への耐性が高まります。
23
EJB 3.0での新機能 – Interceptor (2/2)
WAS
WAS V7
V7 W/S
W/S
Interceptorの利用
Interceptorは一つのクラスとして作成する
EJBのメソッド呼び出し時に割り込み、前後に追加ロジックを埋め込む
前処理、EJBメソッド実行、後処理はInterceptorクラス内に記述
Session BeanまたはMessage Driven Beanで使用可能
getCustomer()
メソッドの呼び出し
EJB3CllientServlet
クラス
Audit1()結果
getCustomer()結果
Audit2()結果
Audit1()、Audit2()
メソッドを前後に挟む
AuditInterceptor
クラス
Audit1()
インターセプト対
象メソッド実行
OrderTaskImpl
クラス
getCustomer()
メソッド
Audit2()
WebSphere Application Server V7
Announcement Workshop 2008
# 24
© IBM Corporation.
EJB3.0ではAOPをInterceptorと呼ばれる実装で実現しています。ログ処理などのAOPの横
断的関心事はInterceptorに記述します。実行時にはクライアントからのメソッド呼び出しを
Interceptorが横取りをする形で処理を挟み込みます。この機能はSession BeanかMessage
Driven Beanでのみ使用可能です。
24
(参考)Interceptorコーディング例
WAS
WAS V7
V7 W/S
W/S
Interceptorクラス
public class AuditInterceptor {
@AroundInvoke
public Object audit(InvocationContext invocationContext) throws Exception
{
まずこのメソッドが実行される
・・・・省略・・・
System.out.println("Customer Id " + param[0] + " executing operation -> " +
name);
return invocationContext.proceed();
}
}
Interceptorされるクラス
Proceed()によってインターセプト
対象のメソッドが実行される
@Stateless
@Interceptors(AuditInterceptor.class)
public class OrderTaskImpl implements OrderTask {
・・・・省略・・・
public Order getCurrentOrder(int customerId) throws CustomerDoesNotExist {
・・・省略・・・
return currentOrder;
}
}
WebSphere Application Server V7
Announcement Workshop 2008
# 25
© IBM Corporation.
Interceptorのコーディング例です。
25
JPA (Java Persistence API)
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 26
© IBM Corporation.
26
JPA登場 の背景
WAS
WAS V7
V7 W/S
W/S
EJB 2.1 でのパーシスタンスの課題
複雑なプログラミング・モデル
Entity Beanは「重過ぎる」
EJBQL は制限が多い (機能的に不足)
対策として他のアプローチの出現
カスタム・フレームワークまたは「素の」 JDBC
オープンソースフレームワークのO/Rマッピング ソリューション
Toplink (現在の EclipseLink)
Hibernate
など
EJB3.0仕様はオープンソースフレームワークのO/Rマッピング方式を選択
WebSphere Application Server V7
Announcement Workshop 2008
# 27
© IBM Corporation.
EJB2.1ではEntity BeanがJavaとRDBを仲介するものとして定義されていました。しかし、
Entity Beanは複雑であるとか、処理が重たい、EJBQLの機能不足など、さまざまな問題点が指
摘されていました。
一方、オープンソースフレームワークの世界ではHibernate、ToplinkなどのO/Rマッピングフ
レームワークが登場し、その使いやすさから様々なところで使われるようになってきました。
EJB3.0ではJPA (Java Persistence API)がEntity Beanにとって変わりましたが、このJPAは
オープンソースフレームワークで実績のあるO/Rマッピング方式をとりいれています。
27
O/Rマッピング概要
WAS
WAS V7
V7 W/S
W/S
O/Rマッピング
オブジェクトとリレーショナル(主にRDBレコード)の間にある差異を吸収して
リレーショナルに格納されているデータをオブジェクトとして直感的に扱いや
すくするための仕組み
以下のようにマッピングされる
クラス⇔テーブル定義
フィールド⇔カラム
インスタンス化されたオブジェクト⇔レコード
支給日: 2007/01/25
支給額: 300000
名字: たなか
名前: よしお
支給日: 2007/01/25
支給額: 250000
社員テーブル
社員ID
名字
名前
126
たなか
よしお
743
すずき
はなこ
名字: すずき
名前: はなこ
手当てテーブル
支給日: 2007/02/10
支給額: 7000
手当てID
対象者ID
支給日
支給額
1
743
2007/1/25
300000
2
126
2007/1/25
250000
3
743
2007/2/10
7000
WebSphere Application Server V7
Announcement Workshop 2008
# 28
© IBM Corporation.
JPAの説明に入る前に、簡単にO/Rマッピングについて説明します。
システムにおけるデータ保管の方式として事実上の標準技術であるリレーショナル・データ
ベースですが、オブジェクトとリレーショナルでは情報の表現の仕方そのものが本質的に異なっ
ています。そのため、オブジェクト指向言語であるJavaでリレーショナルのデータを扱うには、
SQLを発行した結果得られる結果セットから必要な情報を取り出してオブジェクトに構築していく
という、データ表現の違いをコードのレベルで埋め合わせていく作業が必要になります。この、業
務のそのものの実装とは異なり、かつ面倒な作業の繰り返しの多い作業は開発効率を下げる要
因となります。そのためこの作業をツールによってある程度自動化できないか、という観点から出
てきたソリューションがO/Rマッピングです。
28
JPAとは
WAS
WAS V7
V7 W/S
W/S
Java Persistence API(JPA)とは
EJB3.0仕様の一部として策定(JSR220)
POJOベースで簡略化されたO/Rマッピング
javax.persistenceパッケージに定義されたAPI
Java Persistence Query Language (JPQL)
アノテーションでのコーディングが可能に
Java EE 5 または Java SEでの利用が可能
J2EEアプリケーション・サーバー外での利用も可能
WAS V7ではApache OpenJPAをもとにJPA実装がされている
JPA for WebSphere Application Server
機能拡張やユーティリティ追加がされている
wsjpaversionコマンドでOpenJPAのバージョン確認が可能
WebSphere Application Server V7
Announcement Workshop 2008
# 29
© IBM Corporation.
JPAとはEJB3.0で規定されたO/Rマッピングです。従来の(EJB2.1までの)Entity Beanの使
いにくさ・作りにくさ・分かりにくさという反省を踏まえ、POJOをベースにした簡略化されたコード
でのO/Rマッピングを実現しています。APIの定義にはJava Persistence Query Language
(JPQL)という操作言語と、O/Rマッピング用のメタデータ定義が含まれています。
これまでEJBの一種として定義されていたEntity Beanは、EJB3.0ではJPAとして独立した規
格となっています。つまり、JPAはJava EE環境(WASのようなアプリケーション・サーバー環境)
だけでなく、Java SE環境での使用も可能になっています。
また、WASではJPA実装として、Apache OpenJPAをベースに機能拡張やユーティリティ追
加を施したものを採用しています。
WAS V7 InfoCenter - Task overview: Storing and retrieving persistent data with the Java
Persistence API (JPA)
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/tejb_introjpa.html
29
JPA全体像
WAS
WAS V7
V7 W/S
W/S
EntityManager
Entity
Query
Entitiの操作
JPQL
select o from Order o・・・
クライアント・プログラム
getEmp_Id() emp_Id=111111
getName() name=Nakajima
@Entity
Employee
setEmp_Id()
setName()
getPhone() phone=1804-1111 setPhone()
@Id
getEmp_Id() emp_Id
getName() name
setEmp_Id()
phone
setPhone()
getPhone()
setName()
EMPLOYEE表
Persistence
Persistence Context
EMP_ID
NAME
PHONE
111111
Nakajima
1084-1111
222222
Hirabayashi
1804-2222
333333
Yamaguchi
1803-3333
WebSphere Application Server V7
Announcement Workshop 2008
# 30
© IBM Corporation.
JPAの全体像を俯瞰してみましょう。大きく分けて四つの概念をここでは覚えてください。
一つ目は、Entity(エンティティ)です。Entityは表にマップされたオブジェクトです。
二つ目はEntityManager(エンティティ・マネジャー)です。クライアントはEntityを使用するのに、
EntityManagerというインターフェースを介して検索・生成・削除といった操作を行います。
三つ目はPersistence Context(永続化コンテキスト)です。Persistence Contextは
EntityManagerと紐づくエンティティのインスタンスの集合を表します。
四つ目はQueryです。RDBに対してSQLで操作するのと同じ感覚でEntityを操作するために
使用するインターフェースがQueryです。
次のページから、それぞれの概念をもう少し詳しく解説します。
30
Entity
WAS
WAS V7
V7 W/S
W/S
Entityは「永続化可能なJavaオブジェクト」
具体的にはDBの表に相当するオブジェクト
通常のJavaクラス(POJO)に@Entityアノテーションを付与して作成
@Entity
Employeeクラス
インスタンス化・
レコードとの関連付け
emp_Id=111111
name=Nakajima
phone=1804-1111
@Entity
@Entity
アノテーション
アノテーション
EMPLOYEE表
@Id
emp_Id
name
phone
・・・
・・・
@Entity
@Entity
public
class
Employee
public class Employee implements
implements Serializable
Serializable {{
@Id
@Id
private
private int
int emp_Id;
emp_Id;
private
private String
String name;
name;
private
private String
String phone;
phone;
public
public int
int getEmp_Id()
getEmp_Id() {{
return
return this.emp_Id;
this.emp_Id;
}}
public
public void
void setEmp_Id(int
setEmp_Id(int emp_Id)
emp_Id) {{
this.emp_Id
this.emp_Id == emp_Id;
emp_Id;
}}
・・・
・・・
}}
EMP_ID
NAME
PHONE
111111
Nakajima
1084-1111
222222
Hirabayashi
1804-2222
333333
Yamaguchi
1803-3333
テーブルカラム
テーブルカラム
に対応する
に対応する
フィールド
フィールド
Employeeクラス
WebSphere Application Server V7
Announcement Workshop 2008
# 31
© IBM Corporation.
Entityとは「永続化可能なJavaオブジェクト」をさします。具体的にはRDBにある表に相当する
オブジェクトだと思ってください。データベースの表(テーブル)に列(カラム)があるように、Entity
には変数(フィールド)があります。またそれらのフィールドを操作するためのアクセッサー・メソッ
ド(getter/setter)があります。Entityをインスタンス化するということは、データベースの行に相当
するレコードをEntityのフィールドに関連付けることです。
Entityには旧来のEntity Beanのようにhomeインターフェースやlocalインターフェースを作る必
要はありません。通常のJavaクラスを作成し、クラスの頭に@Entityアノテーションを付与して作
成します。書かなくてはならないコードはEntity Beanに比べ格段に減り、またコードの可読性も
大幅に増しています。
ただし、Entityにはいくつかの制約事項があります。newするために引数なしのコンストラクタを
定義する必要がある点、主キーに相当するフィールドを持たなくてはならない点などです。
31
EntityManagerとPersistence Context
WAS
WAS V7
V7 W/S
W/S
EntityManager
Entityを操作するためにJPAが提供するインターフェース
javax.persistence.EntityManager
クライアント・プログラムはEntityManagerを介してEntityを操作
Persistence Conetxt
Entityインスタンスの集合
Persistence Contextの中でEntityManagerにより個々のEntityインスタンスの
ライフサイクルが管理される
EntityManager
クライアント・プログラム
EMPLOYEE表
PersistenceContext
employee
emp_Id=111111
employee
emp_Id=222222
DBへの永続化
インスタンス作成
EMP_ID
NAME
PHONE
111111
Nakajima
1084-1111
222222
Hirabayashi
1804-2222
333333
Yamaguchi
1803-3333
WebSphere Application Server V7
Announcement Workshop 2008
# 32
© IBM Corporation.
EntityManagerはEntityを操作するためのインターフェースです。従来のEntity Beanでは
homeインターフェースという操作用のインターフェースを各Entity Bean毎に定義していました
が、JPAでは共通のインターフェースが提供されるので個々のEntity用に作成する必要はありま
せん。
クライアント・プログラムはこのEntityManagerのメソッドを介してEntityの操作を行います。そう
することにより、Entityとデータベースとの関連付けがなされます。つまり、EntityManagerは
Entity操作用のfaçadeインターフェースと考えてください。
Persistence Contextは永続化コンテキストと訳されますが、名前からは今ひとつ何者であるか
イメージしづらいものです。Persistence Contextを一言で言うと、Entityのインスタンスの集合で
す。Persistence ContextはEntityManagerと関連付けられ、その中で個々のEntityインスタンス
のライフサイクルが管理されます。Persistence Contextは@PersistenceContextアノテーション
をEntityManager宣言の直前に入れる事で、EntityManagerとの関連付けが行われます。
32
(参考) EntityManager/Persistence Context 例
WAS
WAS V7
V7 W/S
W/S
クライアント・プログラム
package
package jpatest.sessions;
jpatest.sessions;
import
import java.util.List;
java.util.List;
import
import
import
import
import
import
javax.ejb.Stateless;
javax.ejb.Stateless;
javax.persistence.EntityManager;
javax.persistence.EntityManager;
javax.persistence.PersistenceContext;
javax.persistence.PersistenceContext;
import
import jpatest.entities.Employee;
jpatest.entities.Employee;
@Stateless
@Stateless
@PersistenceContextを指定して
@PersistenceContextを指定して
public
{{
public class
class EmployeeTaskImpl
EmployeeTaskImpl implements
implements EmployeeTask
EmployeeTask
EntityManagerを取得
EntityManagerを取得
@PersistenceContext
@PersistenceContext
EntityManager
EntityManager em;
em;
}}
public
public Employee
Employee findEmployee(int
findEmployee(int emp_Id)
emp_Id) {{
Employee
Employee employee
employee == (Employee)
(Employee) em.find(Employee.class,
em.find(Employee.class, emp_Id);
emp_Id);
return
return employee;
employee;
}}
EntityManagerのfindメソッドでEntityを取得
EntityManagerのfindメソッドでEntityを取得
WebSphere Application Server V7
Announcement Workshop 2008
# 33
© IBM Corporation.
このページの例は、先ほどのEmployeeというEntityを操作するクライアント・プログラム
(EmployeeTaskImpl)にあるEntityManagerおよびPersistence Contextの例です。
EmployeeTaskImplはStateless Session Beanです。クラス定義の中で
@PersisitenceContextアノテーションと共にEntityManagerが宣言され、そのEntityManagerイ
ンスタンス(em)のfind()メソッドを使用してEntityインスタンスの取得が行われています。
33
Query
WAS
WAS V7
V7 W/S
W/S
Entity永続化状態取得のためのインターフェース
Java Persistence Query Language (JPQL)を実行できる
以下の三種類がある
静的クエリー
動的クエリー
ネイティブ・クエリー
Entityに事前定義したクエリーの呼び出し
呼び出し側プログラムで整形したクエリーの実行
SQLの直接実行
新たに加わった機能
複数行の更新・削除 / JOIN / GROUP BY、HAVING、副照会・・・
名前付きパラメーターの使用
Query
Queryインターフェースを介し
永続化状態取得を依頼
select e from Employee e where
e.phone like ‘1804%’
EntityManager
PersistenceContext
EMPLOYEE表
employee
PHONE=1804-2222
クライアント・プログラム
Query結果Employeeの
インスタンスを取得
DBへの永続化
インスタンス作成
EMP_ID
NAME
PHONE
111111
Nakajima
1084-1111
222222
Hirabayashi
1804-2222
333333
Yamaguchi
1803-3333
WebSphere Application Server V7
Announcement Workshop 2008
# 34
© IBM Corporation.
ここでご紹介するQueryもEntityManager同様、クライアントから使用されるインターフェースで
す。DBアプリケーションのSQLに相当する、Java Persistence Query Language(JPQL:以前
のEntity BeanでのEJBQLに相当)という操作言語をQueryインターフェースに引き渡すことで
Entityを取得します。
これまでのEntity BeanではEntity側に取得されるEJBQLを書き込んでおいて使用する静的ク
エリーのみ対応していました。これはオブジェクト指向の概念からは正しいのですが、データ
ベース・アクセスの観点からは自由度が制限されるものでした。Queryはクライアント側での
JPQLの生成実行、動的クエリーに対応しています。さらに多少手間はかかりますがネイティブの
SQLを実行することも可能ですので、データ・アクセスの自由度はかなり向上しているといえます。
また参照だけでなくJDBCのexecuteUpdate()メソッドのような複数行の更新・削除(バルク・
アップデート/デリート)への対応、JOINの実行、副照会の実行、GROUP BY/HAVING文節の
使用、名前付きパラメーターの使用などが新たに出来るようになっています。
34
(参考) Query 例
WAS
WAS V7
V7 W/S
W/S
静的クエリー
静的クエリー
Entity
Employee
EntityにNamedQueryを定義
@Entity
@Entity
@Table(name="EMPLOYEE",schema=“JPATEST")
@Table(name="EMPLOYEE",schema=“JPATEST")
@NamedQuery(name="getMKEmployees",query="select
@NamedQuery(name="getMKEmployees",query="select ee from
from Employee
Employee ee where
where e.phone
e.phone like
like
'1804%'")
'1804%'")
public
public class
class Employee
Employee implements
implements Serializable
Serializable {{
…
…
クライアントよりNamedQueryを指定して実行
クライアント
動的クエリー
動的クエリー
クライアント
…
…
public
public List<Employee>
List<Employee> findMKEmplStatic()
findMKEmplStatic() {{
Query
Query query
query == em.createNamedQuery("getMKEmployees");
em.createNamedQuery("getMKEmployees");
List<Employee>
List<Employee> employees
employees == query.getResultList();
query.getResultList();
return
return employees;
employees;
}}
…
…
クライアントよりQueryを作成して実行
…
…
public
public List<Employee>
List<Employee> findMKEmpDynamic()
findMKEmpDynamic() {{
String
String queryText
queryText == "select
"select ee from
from Employee
Employee ee where
where e.phone
e.phone like
like '1804%'";
'1804%'";
Query
Query query
query == em.createQuery(queryText);
em.createQuery(queryText);
List<Employee>
List<Employee> employees
employees == query.getResultList();
query.getResultList();
return
return employees;
employees;
}}
…
…
WebSphere Application Server V7
Announcement Workshop 2008
# 35
© IBM Corporation.
静的クエリーおよび動的クエリーのサンプルを掲載します。
上にある静的クエリーの例では、まずEntity側にクエリーを定義しておきます。@Entityアノ
テーションの下に、@NamedQueryというアノテーションにて「getMKEmployee」という名前で
JPQLを定義します。JPQLの中身は「select <取得列> from <Entity> where <条件節>」といっ
た感じで、SQLを書いたことがある方でしたら容易に理解できる内容になっています。クライアン
トはQueryインターフェースをEntityManagerを介してインスタンス化し(ここでは
em.createNamedQuery()メソッドを使用)、Entityに定義した「getMKEmployee」を指定してい
ます。このQueryのインスタンスに対し、getResultList()メソッドで結果行の集合を取得していま
す。
下の動的クエリーの例では、クライアントでEntityManagerのcreateQuery()メソッドに直接
JPQLを書き込み、実行しています。実行内容は同じですが、Entityに事前定義が要らないとい
う点で自由度が高いことに着目してください。
35
Entityの操作例
WAS
WAS V7
V7 W/S
W/S
EMPLOYEEテーブルに新しいレコードをINSERTする
EMPLOYEEテーブルに対応するEntity Employeeクラスをインスタンス化
Employee emp = new Employee(444444,”Ueda”,”1804-4444”)
EntityManagerを取得し、persistメソッドを使用
EntityManagerはアノテーションで取得できる
em.persistent(emp)
(emは上で取得したEntityManagerへの参照)
persistメソッドはEntityをPersistentContextに移し、テーブルへのINSERTを行う
テーブルへのINSERTはトランザクションコミット時。明示的にflushメソッドを使用し
てINSERTさせることも可能
Employeeクラスのインスタンス化
Employee emp = new Employee(444444,”Ueda”,”1804-44442)
EntityManager em
PersistenceContext
Employeeクラス
emp_Idフィールド
nameフィールド
phoneフィールド
Employeeインスタンス
emp_Id=4444
name=Ueda
phone=1804-4444
インスタンスのpersistent命令
em.persist(emp)
Employeeインスタンス
emp_Id=4444
name=Ueda
phone=1804-4444
EMPLOYEE表
EMP_ID
NAME
PHONE
111111
Nakajima
1084-1111
222222
Hirabayashi
1804-2222
333333
Yamaguchi
1803-3333
444444
Ueda
1804-4444
トランザクションコミット時にDB
に反映
WebSphere Application Server V7
Announcement Workshop 2008
# 36
© IBM Corporation.
Entityの操作例としてEmployeeテーブルに新しいレコードを挿入する場合を取り上げてみま
す。
まず、挿入したいデータを代入する形でEntityインスタンスを作成します。作成後、
EntityManagerを取得し、Entityインスタンスに対してEntityManagerのpersistentメソッドを実行
します。メソッド実行時にインスタンスはPersistentContextに移され、DB上のテーブルとの同期
を待ちます。この状態でトランザクションがコミットされるか明示的にflushメソッドが実行されると
Entityインスタンスの持つ情報がテーブルへと反映されます。
JPAでは、このように実際のSQLを意識することなくオブジェクトの操作でテーブルへの情報更
新が可能です。
36
(参考) Entityの操作例 - INSERT
WAS
WAS V7
V7 W/S
W/S
@Stateless
@Stateless
public
public class
class EmployeeTaskImpl
EmployeeTaskImpl implements
implements EmployeeTask
EmployeeTask {{
@PersistenceContext
@PersistenceContext
EntityManager
EntityManager em;
em;
@PersistenceContextを指定して
@PersistenceContextを指定して
EntityManagerを取得
EntityManagerを取得
EntityTracsaction
EntityTracsaction et
et == em.getTransaction();
em.getTransaction();
et.begin();
et.begin();
Employee
Employee emp
emp == new
new Employee(444444,
Employee(444444, "Ueda",
"Ueda", "1804-4444");
"1804-4444");
em.persist(emp);
em.persist(emp);
et.commit();
et.commit();
Employeeエンティティインスタンスを作成してpersist
Employeeエンティティインスタンスを作成してpersist
em.close();
em.close();
Commit時にテーブルに反映される
Commit時にテーブルに反映される
WebSphere Application Server V7
Announcement Workshop 2008
# 37
© IBM Corporation.
前ページの操作のコーディング例です。
37
WAS V7でのEJB3.0
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 38
© IBM Corporation.
38
EJB3.0のWAS V7上での使用
WAS
WAS V7
V7 W/S
W/S
Java EEアプリケーションをWASで使用するときのステップ
アプリケーションの開発
この章の範囲
アプリケーションのアセンブル・パッケージング
アプリケーションのデプロイ
チューニング
アプリケーション運用
WebSphere Application Server V7
Announcement Workshop 2008
# 39
© IBM Corporation.
WAS V7でEJB3.0を使用するときのステップを考えます。
まず、アプリケーションコンポーネントの開発があり、その後、必要なファイルなどをパッケージ
ングし、WAS V7環境へのデプロイという形でアプリケーションをインストールします。インストー
ル後、パフォーマンステストなどを行いながらチューニングを実施し、リリースした後はアプリケー
ションの運用を行っていくことになります。アプリケーション開発については後続のセッションで説
明予定で、アプリケーション運用については昨日のセッションで説明を行いましたので、ここでは
パッケージング、デプロイ、チューニングの3つのポイントについて考えていきます。
39
パッケージング
WAS
WAS V7
V7 W/S
W/S
エンタープライズアプリケーションのパッケージング
EARファイル
EJB-JARファイル
*.class
*.jar (ライブラリ)
ejb-jar.xml
ibm-ejb-jar-bnd.xml
MANIFEST.MF
application.xml
MANIFEST.MF
WARファイル
web.xml
ibm-web-bnd.xml
ibm-web-ext.xml
*.class
*.jar (ライブラリ)
WebSphere Application Server V7
Announcement Workshop 2008
# 40
© IBM Corporation.
エンタープライズアプリケーションのパッケージングです。各モジュールごとに配置するデプロ
イメント記述子 (一部はIBM拡張)を右側に記載しています。このディレクトリやファイル配置場所
といったパッケージングはJava EE 5でもJ2EE1.4と変わりはありません。
40
デプロイメント記述子の省略
WAS
WAS V7
V7 W/S
W/S
Java EE 5ではデプロイメント記述子の省略が可能
application.xmlの省略
省略した場合は以下のようにみなされる
拡張子が.warならWebモジュールとみなされ、コンテキストルートはファ
イル名から.warを除いたものになる
拡張子が.jarでejb-jar.xmlが存在するか、@statelessか@statefulアノ
テーションを含むクラスがあればEJBモジュール
ejb-jar.xmlの省略
アノテーションの利用により参照情報が十分取得できれば省略可
EJBコンテナがアノテーションのスキャンをおこなう
web.xmlについては事実上省略不可
Servlet、Filter、Listenerが
含まれる場合は省略不可
デプロイ時に自動で
ファイルを生成
WebSphere Application Server V7
Announcement Workshop 2008
# 41
© IBM Corporation.
Java EE 5ではデプロイメント記述子の省略が可能になっています。
EARのデプロイメント記述子であるapplication.xmlが省略された場合、存在するモジュール名
の拡張子によってどういうタイプのモジュールかが判断されます。拡張子が.warの場合はWebモ
ジュール、.jarでかつejb-jar.xmlが存在すればEJBモジュールという具合にです。また、ejbjar.xmlもアノテーションを用いて充分な設定がされていれば省略することが可能です。
ただし、web.xmlはServlet、Filter、Listernerのどれかが含まれる場合には省略ができません
ので、多くの場合、省略することは難しいでしょう。また、パッケージングの際には省略が可能で
すが、WASにデプロイをすると省略されたデプロイメント記述子はWASによって作成されます。
いずれのデプロイメント記述子も管理コンソールから確認する事が出来ます。
application.xml:
エンタープライズ・アプリケーション>アプリケーション名>デプロイメント記述子の表示
web.xml/ejb-jar.xml:
エンタープライズ・アプリケーション>アプリケーション名>モジュールの管理>モジュール名>
デプロイメント記述子の表示
WAS V7 InfoCenter - EJB 3.0 module packaging overview
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/cejb_packfep.html
41
デプロイ(1/2)
WAS
WAS V7
V7 W/S
W/S
EJBのデプロイメント
EJBモジュールをWASで動かすにはデプロイメントコードと呼ばれる追加のクラ
スを生成する必要がある
EJB2.1以前ではEJBDeployコマンドを使用
EJB3.0モジュールでは不要
JITデプロイメント
EJB3.0ではJITデプロイメントと呼ばれる機能が追加されている
アプリケーション起動時にメモリー上にデプロイメントコードを自動的に生成
必要なし
WebSphere Application Server V7
Announcement Workshop 2008
# 42
© IBM Corporation.
次はデプロイについてです。
開発したEJBコンポーネントをWAS上で稼動させるにはデプロイメントコードと呼ば
れる追加のクラスを生成する必要があります。EJB2.1以前ではEJBDeployコマンドを
用いてデプロイメントコードを生成していました。
それに対し、EJB3.0ではJITデプロイメントという機能が追加されました。これはアプ
リケーション起動時にメモリー上にデプロイメントコードを自動的に生成してくれる機能
です。これによりEJB3.0ではEJBDeployコマンドを実行する必要はなくなりました。な
お、EJB3.0モジュールに対してEJBDeployコマンドを実行させることもできますが、何
もおこりません。
42
デプロイ(2/2)
WAS
WAS V7
V7 W/S
W/S
JITデプロイメントが使用できない場合の代替ツール
createEJBStubsコマンド
EJBクライアントがEJB3.0をサポートしない環境の場合はツールで
スタブクラスを生成する必要がある
例:
J2SEクライアント、FP-EJB3.0が適用されていないWAS V6.1以前の
コンテナ、WAS環境以外の場合等
<WAS_root>/bin/createEJBStubs.bat(.sh)
ejbdeployコマンド
EJB2.1以前のバージョンのデプロイで使用
デプロイ時、または開発時に管理コンソール、コマンドライン、開
発ツール上のいずれかで実行
EJB3モジュールでは何も起こらない
EJB2.1のモジュールが含まれるアプリはejbdeployコマンドをオプ
ション付きで実行する
<WAS_root>/bin/ejbdeploy.bat(.sh) -complianceLevel 5.0
WebSphere Application Server V7
Announcement Workshop 2008
# 43
© IBM Corporation.
JITデプロイメントはWAS V7およびWAS V6.1でEJB3.0 Feature Packが適用されている環
境でのみ使用することができます。これ以外の場合は利用できませんので、別のツールを使用
する必要があります。
たとえば、EJBクライアントがWAS V7またはWAS V6.1 EJB3.0 Feature Packの環境下にな
い場合は、createEJBStubコマンドを使用してスタブクラスを生成する必要があります。また、
EJB3.0とEJB2.1のモジュールが混在するなどの場合には、WASV6.1以前の環境と同様に
EJBDeployコマンドの実行が必要です。
WAS V7 InfoCenter - Create stubs command
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/rejb_3stubscmd.html
WAS V7 InfoCenter - The ejbdeploy command
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.etools.ejb
batchdeploy.doc/topics/regenc.html
43
バインディング(1/2)
WAS
WAS V7
V7 W/S
W/S
EJB3.0のビジネスインターフェースはWASのネーミングサービスに紐付け
られる
これをバインディングという
バインディングファイル(ibm-ejb-jar-bnd.xml)を用いてバインディングを定
義できる
<ejb-jar-bnd xmlns“ ・・・ version="1.0">
<session name="CalcBean">
<interface class="test.ejb.Calc" binding-name="ejb/Calc"/>
</session>
</ejb-jar-bnd>
インターフェースがローカルかリモートかによって2種類の名前空間が用
意される
ローカルインターフェースの場合は同一JVM内のみで有効な名前空間
「ejblocal:」で始まる
リモートインターフェースの場合は他のJVMからもアクセス可能なグローバル
な名前空間
WebSphere Application Server V7
Announcement Workshop 2008
# 44
© IBM Corporation.
アプリケーションデプロイ時にEJB3.0のビジネスインターフェースはWASのネーミングサービ
スに紐付けられます。これをバインディングと呼びます。バインディングファイルが存在しない場
合には、ここに記載したルールに従ってデフォルトのバインディングが割り当てられます。
インターフェースがローカルかリモートかによって2種類の名前空間が用意されます。
WAS V7 InfoCenter「Application bindings」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/crun_app_bindings.html
WAS V7 InfoCenter「EJB 3.0 application bindings overview」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/cejb_bindingsejbfp.html
44
バインディング(2/2)
WAS
WAS V7
V7 W/S
W/S
EJB3.0ではバインディングファイルを省略することも可能
EJB2.1までバインディングファイル(ibm-ejb-jar-bnd.xmi)が常に必要
ルールにしたがってデフォルトのバインディングをコンテナが定義して
くれる
long、shortの2種類のバインディングを定義
shortの方がシンプルでポータビリティは高いが、異なるクラスが同名のイン
ターフェースを持つ場合は使用できない
EAR名: CalcEJB3EAR
モジュール名: CalcEJB3EJB
コンポーネント名: test.ejbCalcBean
リモートインターフェース: test.ejb.Calc
long
dumpNamespaceコマンド出力
28 (最上位)/nodes/AA315630Node02/servers/server1/ejb/CalcEJB3EAR/CalcEJB3EJB.jar/CalcBean#test.ejb.Calc
28
test.ejb.Calc
…
44 (最上位)/nodes/AA315630Node02/servers/server1/test.ejb.Calc
44
test.ejb.Calc
short
WebSphere Application Server V7
Announcement Workshop 2008
# 45
© IBM Corporation.
バインディングファイルが存在しない場合には、ここに記載したルールに従ってデフォルトのバ
インディングが割り当てられます。
デフォルトのバインディングはshort、longの2種類が定義されます。
shortはパッケージを含めたインターフェース名でlongはアプリケーション名、モジュール名、コ
ンポーネント名をもとに決定されます。
shortの方がシンプルでポータビリティは高いですが、異なるクラスが同名のインターフェース
を持つ場合は使用できません。
その場合は、shortをdisableにする必要があります。
WAS V7 InfoCenter「Application bindings」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/crun_app_bindings.html
WAS V7 InfoCenter「EJB 3.0 application bindings overview」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/cejb_bindingsejbfp.html
45
チューニングポイント
WAS
WAS V7
V7 W/S
W/S
スレッドプール
Webコンテナースレッドプール
ORBスレッドプール
EJBコンテナ
Webコンテナー
スレッド・プール
ORB
スレッド・プール
Application
Application
Server
Server
(WebContainer)
(WebContainer)
Object
Application
Object
Application
Request
Server
Request
Server
Broker
(EJBContainer)
Broker (EJBContainer)
DB
Local or Remote
WebSphere Application Server V7
Announcement Workshop 2008
# 46
© IBM Corporation.
EJBを使用する場合のチューニングポイントについてお話します。
リクエストキューイングの考え方から、まずポイントとして挙げられるのはスレッドプールです。
EJBを使用している場合にはWebコンテナースレッドプールおよびORBスレッドプールで並列
度の制御を行います。
またEJBコンテナにもチューニング可能な項目がありますので、いくつかのパラメータについて
説明します。
46
スレッド・プールのチューニング
WAS
WAS V7
V7 W/S
W/S
Webコンテナスレッド・プール
ローカルインターフェース使用時はEJBコールもWebコンテナーのス
レッドで処理される
Webコンテナー・スレッドプールをチューニング
ORBスレッド・プール
リモートインターフェースを使用している場合はEJBコールの際には
ORBスレッドを使用される
ORBスレッド・プールをチューニング
Concurrency
Webコンテナー
スレッド・プール
Application
Application
Server
Server
(WebContainer)
(WebContainer)
Concurrency
ORB
スレッド・プール
Object
Application
Object
Application
Request
Server
Request
Server
Broker
Broker (EJBContainer)
(EJBContainer)
WebSphere Application Server V7
Announcement Workshop 2008
# 47
© IBM Corporation.
まずはスレッド・プールのチューニングについてです。
EJBクライアントとEJBコンテナーが同一アプリケーションサーバー上に配置されている場合に
は、ローカルインターフェースを使用することが可能です。この場合にはEJBコンテナーが受ける
リクエスト数について設定することはできません。 並列度はクライアント側、つまりWebコンテナ
のスレッド・プールサイズを調整します。
EJBクライアントからリモートインターフェースでEJBにアクセスする際にはORBスレッドプール
の調整が必要です。
47
(参考)Webコンテナスレッド・プールのチューニング
WAS
WAS V7
V7 W/S
W/S
Webコンテナのプールサイズ設定
Webコンテナーの並列度を設定
WebSphere Application Server V7
Announcement Workshop 2008
# 48
© IBM Corporation.
管理コンソールより、以下を選択して下さい。
サーバー>Webコンテナー・トランスポート・チェーン>WCInboundDefault>TCP インバウンド・
チャネル (TCP_2) >スレッド・プール > WebContainer
48
(参考)ORBスレッド・プールのチューニング
WAS
WAS V7
V7 W/S
W/S
アプリケーションサーバーを選択し、[コンテナーサービス]→[ORBサービス]
リモートのEJBクライアントからアクセスがある場合にはスレッド・プールを設定
設定画面へはORBサービス画面、または追加プロパティの[スレッド・プール]から
スレッドプールのデフォルトは最大50スレッド、最小10スレッド
非活動タイムアウトを使用してアイドル状態にあるスレッドを開放
ORBスレッドプールの
スレッド数を設定
空きスレッドは小まめに開放
ORB接続オブジェクトの
キャッシュサイズを指定
WebSphere Application Server V7
Announcement Workshop 2008
# 49
© IBM Corporation.
リモートのEJBクライアントからのアクセスに対しては最大・最小スレッド数を設定することが可
能です。設定は管理コンソールからアプリケーションサーバー選択し、[コンテナーサービ
ス]→[ORBサービス]→[スレッド・プール]の画面から最大・最小サイズを設定します。デフォルト
は最大サイズが50スレッド、最小サイズが10スレッドです。
49
EJBコンテナのチューニング
WAS
WAS V7
V7 W/S
W/S
EJBコンテナでチューニングできるパラメータ
インスタンスプールサイズ
Stateless Session Bean / Message Driven Beanのインスタンスは一定個数
プールされる
TPVなどで最適なプールサイズを算出する
EJBキャッシュ・サイズ
Stateful Session Beanはデフォルト設定では、このサイズを越えると永続化
されてしまう
インスタンス
プール
Object
Application
Object
Application
Request
Server
Request
Server
Broker
Broker (EJBContainer)
(EJBContainer)
EJBキャッシュ
WebSphere Application Server V7
Announcement Workshop 2008
# 50
© IBM Corporation.
EJBコンテナでチューニングできるパラメータの一部をここでは扱います。
Stateless Session Bean、Message Driven Beanのインスタンスは作成、削除のオーバー
ヘッドを抑えるために一定個数、プールされます。このプールサイズはTPVなどで確認しながら
新たなインスタンス作成や破棄などの負担が少なくなるように、最適な値を算出すると良いでしょ
う。
Stateful Session BeanやEntity BeanはEJBコンテナによってキャッシュされます。特に
Stateful Session Beanはこのキャッシュサイズを越えると永続化されてしまい、その処理によっ
てパフォーマンスがダウンする可能性があります。こちらはEJBトレースなどを用いて最適値を探
ることができます。
50
(参考)EJBコンテナのインスタンス・プールサイズのチューニング
WAS
WAS V7
V7 W/S
W/S
EJBインスタンス・プールサイズの設定
Java仮想マシンの汎用JVM引数に設定
-Dcom.ibm.websphere.ejbcontainer.poolSize=<application_name>
#<module_name>#<enterprisebean_name>=<minSize>,<maxSize>
(設定例) ivtApp#ivtEJB.jar#ivtEJBObject=125,1327
TPVにて確認
プール内のインスタンスの大多数を使用している場合、プールサイズを大きくする
はじめは、最小と最大サイズを等しく設定する
WebSphere Application Server V7
Announcement Workshop 2008
# 51
© IBM Corporation.
このプロパティーはStateless Session Bean、Message Driven Bean、Entity Bean に対して
適用されます。管理コンソールより、以下を選択して設定してください。値を指定しない場合は、
コンテナーのデフォルト値であるminSize50、maxSize500 が使用されます。
サーバー>プロセス定義>Java仮想マシン>汎用JVM引数
WAS V7 InfoCenter - EJB container system properties
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/rejb_ecnt.html
51
(参考)EJBキャッシュの設定
EJBキャッシュの設定
WAS
WAS V7
V7 W/S
W/S
クリーンアップ間隔
コンテナーがキャッシュから未使用アイテムを除
去する間隔(ミリ秒)
デフォルトは3000
キャッシュサイズ
EJBコンテナ内のアクティブ・インスタンスの数
通常時に予想されるアクティブ・インスタンスの
最大数を設定する
デフォルトは2053
WebSphere Application Server V7
Announcement Workshop 2008
# 52
© IBM Corporation.
管理コンソールより、以下を選択して下さい。
サーバー>EJBキャッシュ設定
WAS V7 InfoCenter - EJB cache settings
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/uejb_rcash.html
52
(参考)EJBキャッシュのチューニング
WAS
WAS V7
V7 W/S
W/S
トレースによるEJBキャッシュのチューニング
設定
com.ibm.ejs.util.cache.BackgroundLruEvictionStrategy=all=enabled:com.ibm.ejs.util.c
ache.CacheElementEnumerator=all=enabled
出力例
[省略] BackgroundLru 3
[省略] BackgroundLru 3
[省略] BackgroundLru 3
…
[省略] BackgroundLru <
EJB Cache: Sweep (82,40) - Cache limit not reached : 0/2053
EJB Cache: Sweep (83,40) - Cache limit not reached : 0/2053
EJB Cache: Sweep (84,40) - Cache limit exceeded : 3589/2053
EJB Cache: Sweep (84,40) - Evicted = 50 : 3589/2053 Exit
チューニング方法
「Cache limit」,「Evicted」を検索する
Cache limit not reached
設定値が適切かそれ以上である。
Cache limit exceeded
使用中のBean数が、指定された容量を超えて
いる。
Evicted
キャッシュ制限を超えた場合、出力される事がある。
システム全体のメモリー使用量を考慮し、 EJBキャッシュサイズをチューニングする
WebSphere Application Server V7
Announcement Workshop 2008
# 53
© IBM Corporation.
EJBキャッシュをチューニングするには、トレースを設定し出力されたメッセージを元にします。
トレースの設定方法と、トレースの出力例を記載しました。
EJB キャッシュ設定値はハード制限ではなく、容量がこの設定値を超えることがあります。この
制限に達しても、EJB コンテナーはキャッシュへの Bean の追加を停止しません。これは、キャッ
シュがフルになったとき、Bean に対する要求が実現されなかったり、少なくともキャッシュ・サイ
ズが制限以下になるまで遅延するということを意味します。つまり、キャッシュ制限を超えることが
あっても、EJB コンテナーはキャッシュをクリーンアップして EJB キャッシュ・サイズ未満に保持
することを試みます。
分析の結果、EJB コンテナの観点から EJB キャッシュを最適に設定することは可能ですが、
その値はWASの観点からすると最適ではない可能性があります。キャッシュ・サイズが大きい方
がヒット数は高くなり、EJB キャッシュのパフォーマンスは向上しますが、メモリー使用量は増加し
ます。キャッシュに使用されるメモリーはその製品の他の領域では使用できないので、全体的な
パフォーマンスが低下する可能性があります。メモリーが豊富にあるシステムでは、パフォーマン
スの低下は問題にならず、EJB キャッシュを適切にチューニングすることで全体的なパフォーマ
ンスが向上します。ただし、キャッシュを構成するときには、システムのパフォーマンスと EJB
キャッシュのパフォーマンスを対比させて考慮する必要があります。
WAS V7 InfoCenter「Tuning the EJB cache using the trace service」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/tejb_tunecash.html
53
(参考)トレースの取得
WAS
WAS V7
V7 W/S
W/S
EJBに関して取得できるトレースのストリングが追加
com.ibm.ws.ejbcontainer,*=all
デプロイ時のJITデプロイメントの経緯が取得可能
[省略] EJBLinkObject 3 bean name specified (HelloBean), looking for home in same/specified
module...
[省略] EJBLinkObject 3 looking for home in other modules...
[省略] JITDeploy
> validateInterfaceBasics : TestDBEAR#TestDBEJB.jar#HelloBean Entry
[省略] EJBUtils
3 validateEjbClass : successful : test.session.HelloBean
[省略] JITDeploy
< validateInterfaceBasics : TestDBEAR#TestDBEJB.jar#HelloBean Exit
com.ibm.ws.injectionengine.*=all
デプロイ時のインジェクションの内容と参照解決の経緯が取得可能
[省略] EJBProcessor < resolve Exit
JndiName=
servlet.CalcServlet/calc
Annotation=
@javax.ejb.EJB(name=, beanInterface=class java.lang.Object,
beanName=, mappedName=, description=)
Injected Type/Object= interface test.ejb.Calc/null
Binding Object =
Reference Class Name: test.ejb.Calc
[省略]
アノテーションの指定の内容と
取得オブジェクトの情報
WebSphere Application Server V7
Announcement Workshop 2008
# 54
© IBM Corporation.
WAS V7ではV6.1と比較して、EJBコンテナの動きに関して取得できるトレースの内容が追加
されます。特にJITデプロイメントやアノテーションによるインジェクションなどWAS V7が自動的
に内部で行っている動作については、開発者や管理者の負担は軽減された反面、問題が起き
た時の問題判別が行いにくいという点がネックです。これらのトレースストリングはそれらの問題
が起きたときに有用です。
54
Java SE 6
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 55
© IBM Corporation.
ここからはJava SE 6とありますが、主にランタイムの話を中心に進めていきます。
55
IBM SDK for Java Version 6
WAS
WAS V7
V7 W/S
W/S
WebSphere Application Server V7.0ではJDKとしてIBMが開発したIBM SDK
for Java Version 6 を使用
Java SE 6の仕様に準拠
Java SE 6はEoD、XML & Web Servicesサポートなどを目標に仕様策定され
ている
JSR 270: JavaTM SE 6 Release Contents
IBM SDK for Java Version 6は前バージョンと比較してパフォーマンス面で
いくつかの改良がなされている
共有クラスキャッシュ
参照の圧縮
56
WebSphere Application Server V7
Announcement Workshop 2008
# 56
© IBM Corporation.
WAS V7ではJDKとしてIBM SDK for Java Version 6 を使用しています。このJDKはJava
SE 6の仕様に準拠しています。またVersion 5のときと比較してパフォーマンス関連での改良が
なされています。
56
JDBC4.0
WAS
WAS V7
V7 W/S
W/S
JDBCドライバーによる接続の妥当性検査
タイムアウト期間内において、DB接続をアプリケーションに割り当てる
前に検証する
接続検証が有効に設定されている場合のみ設定可
JDBC仕様レベル4.0以上に準拠したJDBCドライバー
接続検証
新規接続の検証、既存プールの検証
SQL照会による検証は、V7では非推奨
エラー検出モデル
例外マッピングモデルの使用(デフォルト)
JDBCドライバーによってスローされた例外を、データ・ストア・ヘルパーのエラーマップに定義された例外で置換する
例外検査モデルの使用
JDBCドライバーによってスローされた例外を、データ・ストア・ヘルパーのエラーマップに定義された例外で置換しない
WebSphere Application Server V7
Announcement Workshop 2008
# 57
© IBM Corporation.
Java SE 6での仕様追加のひとつとしてJDBC4.0があります。WAS V7ではJDBC4.0の機能に
対応したデータソースの接続検証プロパティーという設定が追加されています。
また、JDBC関連でエラー検出モデルという設定項目が追加されています。
接続検証プロパティおよびエラー検出モデルは、管理コンソールより、「リソース > JDBC >
データ・ソース > WebSphere Application Server データ・ソース・プロパティ」を選択すると表示
されます。
57
(参考)Java Standard Edition Platform, Version 6
WAS
WAS V7
V7 W/S
W/S
IBM SDK for Java Version 6 は Sun® Java 仕様に準拠
JSR 173: Streaming API for XML
JSR 222: Java Architecture for XML Binding (JAXB) 2.0
JSR 224: Java API for XML-based Web Services (JAX-WS) 2.0
JSR 118: Web Services Metadata for the Java Platform
JSR 250: Common Annotations for the Java Platform
JSR 269: Pluggable Annotation Processing API
JSR 221: JDBC 4.0 API Specification
JSR 199: Java Compiler API
JSR 223: Scripting for the Java Platform
JSR 202: Class file specification update
WebSphere Application Server V7
Announcement Workshop 2008
# 58
© IBM Corporation.
Java SE 6の仕様です。
58
ランタイム環境 – プラットフォームごとの違い
WAS
WAS V7
V7 W/S
W/S
Windows, AIX, Linux, z/OS
The IBM SDK for Java Version 6を使用
System i プラットフォームでは Java ランタイムはOS の一部
アプリケーション・サーバーにはバンドルされない
J9 と Classic の 2つのバージョンを利用可能
Solaris と HP はハイブリッド JDK を使用
ランタイムは IBM のものではない
IBM XML、セキュリティ、ORB ライブラリをバンドル
WebSphere Application Server V7
Announcement Workshop 2008
# 59
© IBM Corporation.
WAS V7の前提となるJDKはプラットフォームによって異なります。 IBM SDK for Java
Version 6はWindows、AIX、Linux、z/OSのプラットフォームで前提となるJDKで
す。SolarisとHPのJDKのランタイムはIBMのものではなく、Sun Hotspotを基本にして
IBMのライブラリを付加したものになります。
System iについては後続のセッションで詳しく説明します。
59
共有クラスキャッシュ
WAS
WAS V7
V7 W/S
W/S
共有クラスキャッシュとは
複数のJVM間で共通して使用するクラスを共有できるようにする仕組み
JVMの起動時間の縮小と使用メモリのフットプリント減少に効果がある
IBM SDK for Java 5 で導入
デフォルトでは有効
JVM引数に-Xshareclasses:noneを指定することで無効にできる
JVMの使用するメモリ
JITコードキャッシュ
JVM 1
Heap領域
Class Memory Segments
ディスク上の
クラス
重複するクラス
を共有
Class Memory Segments
JVM 2
Heap領域
JITコードキャッシュ
WebSphere Application Server V7
Announcement Workshop 2008
# 60
© IBM Corporation.
JVMのパフォーマンス向上の仕組みのひとつとして共有クラスキャッシュがあります。これは
IBM JDK V5で導入されたもので、複数のJVM間で使用するクラスを共有する仕組みです。この
機能を用いることによりJVMの起動時間の短縮と使用メモリのフットプリントを減少させることがで
きます。
デフォルトで有効になっており、無効化するにはにはJVM汎用引数に-Xshareclasses:none
を指定します。
WAS V7 InfoCenter – Java virtual machine settings
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/urun_rconfproc_jvm.html
60
共有クラスキャッシュ – V6での改良点
WAS
WAS V7
V7 W/S
W/S
V6ではOS再起動をまたいで共有クラスキャッシュの情報を保
持することが可能
V5ではOS再起動の際にキャッシュ情報は消去されていた
V6ではキャッシュ情報をファイルに書き出すことによりOS再起動をまた
いで情報を保持することを可能にしている
JVM汎用引数で設定
有効
無効
-Xshareclasses:persistent
-Xshareclasses:nonpersistent
WebSphere Application Server V7
Announcement Workshop 2008
# 61
© IBM Corporation.
共有クラスキャッシュはIBM JDK V5で導入されましたが、V6でいくつかの改良がされています。
V5ではOSを再起動させるとキャッシュ情報はクリアされてしまいましたが、V6ではファイルに書
き出すことによってOS再起動をまたいでキャッシュ情報を保持させることが可能になっています。
これによりOS再起動後の最初のJVM起動時間の短縮がはかれます。
またV6ではキャッシュできるデータタイプも増えています。
Java Diagnostics Guide 6 - Class data sharing command-line options
http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp?topic=/com.ibm.java.doc.
user.aix32.60/user/sharedclassesxoptions.html
61
参照の圧縮 (Compressed references)
WAS
WAS V7
V7 W/S
W/S
WAS V6.1では64bit版が32bit版と比較してヒープ使用量が60%程度増加
64bit版ではオブジェクト参照のポインターが8バイト(32bit版の倍)
WAS V7.0 64bit版ではポインターを圧縮することによって必要なヒープ使
用量を削減する機能を実装
ランタイムは内部で 32bit 参照と 64bit ポインタを変換
64bit IBM JDK において、ヒープサイズが約29GB以下(プラットフォー
ムごとに異なる)の場合に利用可能
Solaris 64bit JVM、HP-UX 64bit JVM、iSeries Classic 64bit JVMではサ
ポートされない
デフォルトは使用不可
有効化するには –Xcompressedrefs オプションを使用
WebSphere Application Server V7
Announcement Workshop 2008
# 62
© IBM Corporation.
V6.1では64bit版が32bit版と比較してヒープ使用量が多く、比較すると60%程度増加する傾
向にありました。これはオブジェクト参照のポインターサイズは32bit版が4バイトであるのに対して
64bit版では8バイトであるのが大きな原因でした。
V7でもV6.1と同じく64bit版のヒープ使用量の方が32bit版よりも同程度大きくなりますが、これ
に対する機能として参照の圧縮(Compressed references)が導入されています。これは文字通
り64bit版の8バイトの参照を4バイトに圧縮する機能でヒープ使用量の削減に効果があります。
ただし、ヒープサイズが29GB以下(サイズはプラットフォーム依存)の場合に限られ、Soraris
64bit JVMなどサポートされないプラットフォームもあります。
この機能はデフォルトでは使用不可となっており、JVM汎用引数に-Xcompressedrefsを指定
することによって有効化できます。
WAS V7 InfoCenter - Tuning the IBM virtual machine for Java
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/tprf_tunejvm_v61.html
62
32bit版 vs 64bit版
WAS
WAS V7
V7 W/S
W/S
大きなヒープを確保する必要があるときは64bit版を使用
32bit版では使用できるヒープ容量に限界がある。
AIXの場合は3.2GB。これ以上のヒープを使用する場合は64bit版を
選択する必要がある。
ヒープ消費量の観点では32bitの方が有利
同一アプリケーションのヒープ使用量を見た場合、64bit版は32bit版
と比較して使用量が増える傾向にある
約60%程度増加する傾向にある
参照の圧縮(Compressed references)の使用
この機能を用いることによって64bit版のヒープ消費量を軽減する
ことが可能
ただしCPU使用率は若干増加
WebSphere Application Server V7
Announcement Workshop 2008
# 63
© IBM Corporation.
32bit版と64bit版の選択ポイントです。
まず一つ目のポイントは最大ヒープサイズです。32bit版では使用できる最大ヒープサイズが
64bit版と比較するとかなり小さくなります(32bit版 AIXの場合は3.2GB)。32bit版の最大値を越
えるヒープを使用したいときには64bit版の選択を考える必要があります。
次のポイントはヒープ使用量です。ヒープ使用量の観点では32bit版の方が有利です。物理メ
モリが少なく、なるべくヒープ使用量を抑えたい場合などは32bit版の使用を考えてください。また
V7になって64bit版に参照の圧縮機能が追加されています。こちらも使用ヒープ量を抑えること
が可能ですが、有効にすると若干CPU使用率が増えることになりますので、ご注意ください。
63
ガーベージ・コレクター
WAS
WAS V7
V7 W/S
W/S
中核の技術は Java 5 と同様
-Xgcpolicyオプション(GCポリシー)もJava 5と同様
JVMオプション
GCの実施方法
GCの形態
-Xgcpolicy:optthruput
Stop-the-world
Mark&sweep
オプション1
-Xgcpolicy:optavgpause
concurrent
Mark&sweep
オプション2
Xgcpolicy:subpool
Stop-the-world
Mark&sweep
-Xgcpolicy:gencon
Stop-the-world
(Nursery)
Concurrent
(Tenured)
Copying + Mark&Sweep
(世代別管理)
デフォルト
オプション3
変更点
パフォーマンス
クラスローダーのロード/アンロード速度とフットプリントの改善
世代別 GC ポリシー
Nursery (New) 領域サイズのデフォルト64MB制限の廃止
WebSphere Application Server V7
Announcement Workshop 2008
# 64
© IBM Corporation.
GCについてはV6.1から大きな変更はありません。GCポリシーも同じものが設定できます。各
ポリシーの詳細については以下のワークショップ資料を参照ください。
WAS V6.1アップデート・ワークショップ – J2SE 5.0
http://www.ibm.com/developerworks/jp/websphere/library/was/was61_ws/
変更点はパフォーマンス改良や世代別GCのNursery領域関連のデフォルト値などです。
Nursery領域サイズのデフォルト最大・最大値はヒープの25%か64MBのどちらか小さいほうとい
う制限がありましたが、V6ではこの64MB制限が廃止され、デフォルト値はヒープの25%となって
います。どちらにせよ、あくまでデフォルト値なので適切な値で上書きすることは可能です。
64
(参考) verbose:gc出力例
WAS
WAS V7
V7 W/S
W/S
native_stderr.log
<af type="tenured" id="22" timestamp="Oct 14 18:50:38 2008" intervalms="3270.260">
<minimum requested_bytes="32" />
<time exclusiveaccessms="0.066" meanexclusiveaccessms="0.066" threads="0" lastthreadtid="0x16A4FB00" />
<refs soft="2211" weak="12583" phantom="56" dynamicSoftReferenceThreshold="12"
maxSoftReferenceThreshold="32" />
<tenured freebytes="490496" totalbytes="61341696" percent="0" >
<soa freebytes="0" totalbytes="60851200" percent="0" />
<loa freebytes="490496" totalbytes="490496" percent="100" />
</tenured>
<gc type="global" id="26" totalid="26" intervalms="3278.903">
<finalization objectsqueued="161" />
<timesms mark="168.294" sweep="2.426" compact="0.000" total="172.628" />
<tenured freebytes="22500168" totalbytes="61341696" percent="36" >
<soa freebytes="22071112" totalbytes="60912640" percent="36" />
<loa freebytes="429056" totalbytes="429056" percent="100" />
</tenured>
</gc>
<tenured freebytes="22500136" totalbytes="61341696" percent="36" >
<soa freebytes="22071080" totalbytes="60912640" percent="36" />
<loa freebytes="429056" totalbytes="429056" percent="100" />
</tenured>
<refs soft="2122" weak="11674" phantom="56" dynamicSoftReferenceThreshold="11"
maxSoftReferenceThreshold="32" />
<time totalms="175.661" />
</af>
WebSphere Application Server V7
Announcement Workshop 2008
# 65
© IBM Corporation.
verbose:gcの出力例です。出力はV6.1と同じくnative_stderr.logにされます。
65
ダンプファイル
WAS
WAS V7
V7 W/S
W/S
Javacore
Javaプロセスが異常終了したとき、または明示的に命令を送った時に出力さ
れるテキストベースの診断情報
Javadump、Threaddumpなどとも呼ばれている。
以下のように明示的に出力させることが可能(wsadmin / Jythonの例)
wsadmin> jvm = AdminControl.completeObjectName('type=JVM,process=server1,*')
wsadmin> AdminControl.invoke(jvm, 'dumpThreads')
Heapdump
JVMがHeapを使い切ったときに生成
デフォルトの出力形式はバイナリ(拡張子.phd)
Heap上の全てのオブジェクトの情報を出力
以下のように明示的に出力させることが可能(wsadmin / Jythonの例)
wsadmin> jvm = AdminControl.completeObjectName('type=JVM,process=server1,*')
wsadmin> AdminControl.invoke(jvm, 'generateHeapDump')
WebSphere Application Server V7
Announcement Workshop 2008
# 66
© IBM Corporation.
V7でもV6.1と同様にしてJavacore、Heapdumpを生成することができます。
WAS V7 InfoCenter - Dumping threads in server processes using scripting
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/txml_dump.html
WAS V7 InfoCenter - InfoCenter - Generating heap dumps manually
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.webspher
e.nd.doc/info/ae/ae/tprf_generatingheapdumps.html
66
(参考)Javacore出力例
WAS
WAS V7
V7 W/S
W/S
Javacore内のTHREADS subcomponentセクションの出力例
javacoreYYYYMMDD.HHMMDD.<process id>.txt
NULL
-----------------------------------------------------------------------0SECTION
THREADS subcomponent dump routine
NULL
=================================
NULL
1XMCURTHDINFO Current Thread Details
NULL
---------------------3XMTHREADINFO
"SIGABRT Thread" TID:0x33994E00, j9thread_t:0x30118BFC, state:R, prio=10
3XMTHREADINFO1
(native thread ID:0x25300F, native priority:0xB, native policy:UNKNOWN)
NULL
1XMTHDINFO All Thread Details
NULL
-----------------NULL
2XMFULLTHDDUMP Full thread dump J9 VM (J2RE 6.0 IBM J9 2.4 AIX ppc-32 build jvmap326020080826_2233220080826_022332_bHdSMr, native threads):
3XMTHREADINFO
"P=568918:O=0:CT" TID:0x305EF900, j9thread_t:0x30118954, state:CW, prio=5
3XMTHREADINFO1
(native thread ID:0x23603B, native priority:0x5, native policy:UNKNOWN)
4XESTACKTRACE
at java/lang/Thread.sleep(Native Method)
4XESTACKTRACE
at java/lang/Thread.sleep(Thread.java:850)
4XESTACKTRACE
at com/ibm/ws/runtime/WsServerImpl.main(WsServerImpl.java:679)
4XESTACKTRACE
at com/ibm/ws/runtime/WsServer.main(WsServer.java:59)
4XESTACKTRACE
at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method)
4XESTACKTRACE
at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
4XESTACKTRACE
at
sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37(Compiled Code))
WebSphere Application Server V7
Announcement Workshop 2008
# 67
© IBM Corporation.
JavacoreのTHREADS subcomponentセクションの出力例です。
67
(参考)Heapdump出力
WAS
WAS V7
V7 W/S
W/S
heapdumpYYYYMMDD.HHMMDD.<process id>.txt
0x00440780 [56] OBJ [Ljava/lang/String;
0x00441178 0x00441140 0x00441108 0x004410D0 0x00441098 0x00441060 0x00441028 0x00440FF0
0x00440FB8 0x00440F80
0x004407B8 [80] OBJ java/lang/ThreadGroup
0x004415D0 0x00440808 0x00440830 0x004415B0 0x004415C0
0x00440808 [40] OBJ [Ljava/lang/Thread;
0x00447AA8 0x004CFC10 0x004C7998
0x00440830 [32] OBJ [Ljava/lang/ThreadGroup;
0x00441730
0x00440850 [32] CLS java/util/Comparator
0x0075DA00
0x00440870 [32] CLS java/lang/String$CaseInsensitiveComparator
0x00440890 [32] OBJ java/lang/String
0x004408B0
0x004408B0 [112] OBJ [C
0x00440920 [32] OBJ java/lang/String
0x00440940
0x00440940 [112] OBJ [C
0x004409B0 [32] OBJ java/lang/String
0x004409D0
WebSphere Application Server V7
Announcement Workshop 2008
# 68
© IBM Corporation.
Heapdumpの出力例です。デフォルトの出力方式はバイナリですが、テキスト形式で出力する
ことも可能です。メモリ上のオブジェクトと参照元のオブジェクトがツリー構造で表示されています。
Java Diagnostics Guide 6 - Environment variables and Heapdump
http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp?topic=/com.ibm.java.doc.
diagnostics.60/diag/tools/heapdump_env.html
68
Summary
WAS
WAS V7
V7 W/S
W/S
Java EE 5
EoDを目標に仕様策定
オープンソースフレームワークの良い部分を取り入れている
EJB3.0
アノテーションベースでのコーディングが可能
実装の際の負荷が軽減されている
DI / AOPなどの機能が追加
JPA
EJB3.0で独立した仕様として策定
オープンソースフレームワークHibernateに似たO/Rマッピング方式を採用
Java SE 6
WAS V7のJDKはJava SE 6の仕様に準拠
ランタイムはパフォーマンス面でのいくつかの改善がなされている
基本機能はIBM JDK 5を踏襲
WebSphere Application Server V7
Announcement Workshop 2008
# 69
© IBM Corporation.
69
Reference
WAS
WAS V7
V7 W/S
W/S
WebSphere Application Server V7 - InfoCenter
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp
WAS V6.1 Feature Pack for EJB 3.0 ワークショップ資料
http://www.ibm.com/developerworks/jp/websphere/library/was/was61_ejb3fep_ws/
Java Diagnostics Guide 6
http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp
IBM Education Assistant - IBM WebSphere Application Server Version 7
http://publib.boulder.ibm.com/infocenter/ieduasst/v1r1m0/index.jsp?topic=/co
m.ibm.iea.was_v7/plugin_coverpage.html
WebSphere Application Server V7
Announcement Workshop 2008
# 70
© IBM Corporation.
70
Fly UP