More Related Content
Similar to Java EE パフォーマンスTips #glassfish_jp (20)
More from Norito Agetsuma (10)
Java EE パフォーマンスTips #glassfish_jp
- 2. 上妻 宜人 - あげつま のりと
• SIer勤務
• 技術サポート部隊に所属
• Java / Java EE トラブルシューティング
• はてな 見習いプログラミング日記
- 5. Java EEパフォーマンスTips
• プレゼンテーション層 (JSF)
• #1 古いmojarraを使わない (JAVASERVERFACES-2494対策)
• ビジネス層 (EJB/CDI)
• #2 DIはEJBではなくCDIを使う
• #3 @Asynchronous利用時はスレッドプールに注意
• データアクセス層 (JPA)
• #4 JPAのexecuteBatch設定を忘れない
- 8. GlassFish4.0 と Payara4.1 で実測
• 大量のJSFタグがポイント
• 1000, 3000, 5000 タグで GlassFish4.0 と Payara4.1 比較
<h:body>
<h1>JSF Many Component 1000</h1>
<h:form>
<h:outputText value="#{testBean.name}"/>
<h:outputText value="#{testBean.name}"/>
<h:outputText value="#{testBean.name}"/>
<h:outputText value="#{testBean.name}"/>
<h:outputText value="#{testBean.name}"/>
... 以降大量のoutputTextを繰り返す
- 9. タグ数が多い場合は注意
• GlassFish4.0: レスポンスタイムが徐々に低下
• Payara4.1.153 : 5000タグで150ミリ秒
0
1000
2000
3000
4000
5000
1000 2000 3000 4000 5000
レスポンスタイム(ミリ秒)
JSFタグ数
GlassFish 4.0
(mojarra2.2.0)
Payara 4.1.153
(mojarra2.2.11)
マシン情報:
MacBook Air corei5 1.7GHz
JDK1.8.0_60
- 11. Java EEパフォーマンスTips
• プレゼンテーション層 (JSF)
• #1 古いmojarraを使わない (JAVASERVERFACES-2494対策)
• ビジネス層 (EJB/CDI)
• #2 DIはEJBではなくCDIを使う
• #3 @Asynchronous利用時はスレッドプールに注意
• データアクセス層 (JPA)
• #4 JPAのexecuteBatch設定を忘れない
- 13. #2 DIはEJBではなくCDIを使う
• Java EE6 CDI が導入。
• Java EE7 より beans.xml なしでデフォルト有効化。
• Java EE5 まではEJB間でのみDIが利用可。
@Inject
private StockService service;
@Dependent
public class StockService {
// ...
}
- 15. 実際に測っている
• Payara4.1.152でBeanをループ呼び出し
• EJB と CDI Bean を呼び出して比較
// EJB
@Stateless
public class EJBBean {
public String echo(String s) {
return s;
}
}
// CDI
@ApplicationScoped
public class CDIBean {...}
// Client
@Inject
EJBBean ejb;
for (int i = 0; i < loop; i++) {
ejb.echo(String.valueOf(i));
}
- 18. @Transactionalはループで呼ばないこと
• @Transactional の実体はインターセプタ。
• ループ呼出しコストは高い。
271 907 2953
1 8 151909
8822
32761
10000 50000 100000
EJB @Stateless
CDI @ApplicationScoped
CDI @ApplicationScoped & @Transactional
ループ呼び出し回数
マシン情報:
MacBook Air corei5 1.7GHz
JDK1.8.0_60, Payara4.1.153
単位: ミリ秒
- 23. Java EEパフォーマンスTips
• プレゼンテーション層 (JSF)
• #1 古いmojarraを使わない (JAVASERVERFACES-2494対策)
• ビジネス層 (EJB/CDI)
• #2 DIはEJBではなくCDIを使う
• #3 @Asynchronous利用時はスレッドプールに注意
• データアクセス層 (JPA)
• #4 JPAのexecuteBatch設定を忘れない
- 25. EclipseLink のバッチ書き込み設定
• persistence.xml に設定
• eclipselink.jdbc.batch-writing = jdbc (default: none)
• eclipselink.jdbc.batch-writing.size = ... (default: 100)
<persistence-unit name="PostgresPU">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/postgresDS</jta-data-source>
<properties>
<property name="eclipselink.jdbc.batch-writing" value="jdbc"/>
<property name="eclipselink.jdbc.batch-writing.size" value="100"/>
...
- 27. 測定結果
• INSERT 100レコード でも十分な効果がある
• JDBCと比較して、JPA(EclipseLink) は1〜2割遅い
• 1万行であれば、ORMコストはそれほど大きくない
40 128 122375 169 14891243
9023
58247
100レコード 1000レコード 10000レコード
JDBC executeBatch EclipseLink (batch-writing=jdbc) EclipseLink (batch-writing=none)
単位: ミリ秒
マシン情報:
MacBook Air corei5 1.7GHz
JDK1.8.0_60, Payara4.1.153, PostgreSQL9.3