Java EEの話(仮)
Upcoming SlideShare
Loading in...5
×
 

Java EEの話(仮)

on

  • 222 views

2014/9/17 の #JJUG 並行処理勉強会の発表内容です。

2014/9/17 の #JJUG 並行処理勉強会の発表内容です。

Statistics

Views

Total Views
222
Views on SlideShare
208
Embed Views
14

Actions

Likes
2
Downloads
1
Comments
0

1 Embed 14

https://twitter.com 14

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Java EEの話(仮) Java EEの話(仮) Presentation Transcript

  • Java EEの話(仮) 久保智
  • 本日のレガシー枠です。
  • 今回の内容 • Java EEの昔の話 • 並行処理でハマった内容
  • WebサーバーとしてのJava EE
  • WebサーバーとしてのJava EE • 多数のリクエストを同時にさばくため平行に 処理が行われている
  • Java EE(Servlet)以前
  • Java EE(Servlet)以前 • CGIに代表されるリクエストを受け付けるた びにプロセスを立ち上げる形式のWebサー バー • プロセスを立ち上げるため、メモリの確保 等だけで無駄な負荷がかかっていた
  • Java EE(Servlet)後
  • Java EE(Servlet) • プロセスが立ち上がっておいてその中で処理 を行う • 処理自体の負荷だけで、オーバーヘッドはあ まりない
  • Java EE(Servlet) • Servletは更に最適化を行ってServlet毎に1イン スタンスで全てのリクエストを処理する • 昔のJVMはクラスのnewに時間がかかってい た
  • 並行処理は難しいのか
  • 難しいです
  • 難しい例:SingleThreadModel
  • 難しい例:SingleThreadModel • Servletがimplimentsすると一つしか出来ない インスタンスがリクエストごとに生成される ようになるJ2EEのspecで定められたクラス • スレッドセーフになるように
  • 難しい例:SingleThreadModel • 現在は非推奨 • インスタンスを生成するだけでは意味がなかっ た(例:static変数へのアクセス)
  • Java EEの仕様を決めている人 も間違えることがある
  • 難しいので どんどん失敗しましょう
  • ここから失敗した例ベースで
  • SimpleDateFormat
  • SimpleDateFormat • スレッドセーフでないクラスの例として有名 • 今はJavaDocにスレッドセーフでないと記載され ているが昔はされていなかった • JavaDocにスレッドセーフだと記載されていない 場合はスレッドセーフでないものとして扱おう
  • System.out
  • System.out • 複数スレッドから同時に書き込むとブロック する • 拾ってきたjarで呼ばれてた/(^o^)\
  • System.out • ログ出力ライブラリ使いましょう\(^o^)/
  • HttpSession
  • Servletのスコープ
  • Servletのスコープ • Pageスコープ • HttpRequestスコープ • HttpSessionスコープ • Applicationスコープ(Singleton)
  • Servletのスコープ(その他) • Flashスコープ • Viewスコープ • Conversationスコープ
  • Servletのスコープ(その他) • Flashスコープ • Viewスコープ • Conversationスコープ Sessionスコープの亜種
  • Page、HttpRequestスコープ • スレッドごとに生成されるので特に意識す ることなし
  • Applicationスコープ • アプリケーション内で共有される • アクセスには気をつけるよね?
  • HttpSessionスコープ
  • HttpSessionスコープ • ブラウザ単位で同時にアクセスされる可能性 がある • アクセス時には安全のためロックしましょう
  • HttpSessionスコープ
  • ロックできない場所もある
  • HttpSession#invalidate()
  • HttpSession#invalidate() • セッションを破棄する • すでに破棄されている場合に呼び出すと Exceptionが発生する • HttpSessionにすでに破棄されているかどうか を判定するメソッドspecにはない
  • HttpSession#invalidate() 例外処理中に呼び出されることが多いので ここでExceptionを発生させない
  • HttpSession#invalidate() • Tomcatだと実装を直接扱えば破棄されている かを判定するメソッドがある\(^o^)/
  • JSF(mojarra)/CDI(weld)の場合
  • JSF(mojarra)/CDI(weld)の場合 • 複数スレッドからの同一オブジェクトへの同 時アクセスはブロックされる • getterだけでも\(^o^)/
  • JSF(mojarra)/CDI(weld)の場合 • CDIのspecには記載なし。weldの仕様? • なんでもかんでもSingletonにすると逆に性能 劣化が(ヽ´ω`)
  • JSF(mojarra)/CDI(weld)の場合 • スコープは適切に扱いましょう
  • EJB
  • Stateless SessionBean
  • Stateless SessionBean • 状態をもたないSessionBean • コンテナがインスタンスをプールして複数ス レッドで使いまわされる • 同じインスタンスに複数スレッドから同時に アクセスされることはない
  • Stateless SessionBean • コンテナのプールはデフォルトでは無効化さ れている場合が多い • 作っている最中は毎回インスタンスが生成さ れる • 結合試験環境に乗せたら/(^o^)\
  • Stateless SessionBean • Stateless SessionBeanに状態を持たせるのは止 めましょう\(^o^)/ • コードレビューもしましょう\(^o^)/
  • JPA
  • JPAのキャッシュ
  • JPAのキャッシュ • 毎回データベースに値を取りに行くのは非効 率なのでキャッシュを行う
  • JPAのキャッシュ • 同じスレッド内でキャッシュを行うL1キャッ シュ • 複数のスレッドにまたがるキャッシュを行 うL2キャッシュ
  • JPAのキャッシュ • JPAのキャッシュはPKを比較することで キャッシュされているかを判断する • PKの比較が重い場合はキャッシュしたほう が重くなることも/(^o^)\
  • JPAのキャッシュ • 複合主キーはやめましょう\(^o^)/
  • JPAのキャッシュ • L2キャッシュはspecではデフォルトでは無効 になっていますが、EclipseLinkではデフォル トで有効になってます
  • JPAの楽観ロック
  • JPAの楽観ロック • @versionアノテーションを付けるだけで楽観 ロックが出来る • 複数スレッドからの同時更新を防ぐ
  • JPAの楽観ロック • JPQLからのupdateでは楽観ロックが有効にな らない • 自分たちで管理しましょう
  • JPQL • ついでにキャッシュも無視するよ\(^o^)/ • L2キャッシュは性能が問題にならない限り 切っておきましょう\(^o^)/
  • 最後
  • CDIの非同期処理
  • CDIの非同期処理 • @Asynchronousを付けるだけで非同期処理に \(^o^)/
  • 簡単だけど 障害時を考えるとそれでいいのか
  • 簡単だけど 障害時を考えるとそれでいいのか • 非同期でやるぐらいだから時間のかかる処 理のはず • リトライは? • APサーバー落としたら一緒に動かなくなっ ていいの?
  • CDIの非同期処理 • 非機能要件についても一度考えてから採用を \(^o^)/
  • 以上 ご清聴ありがとうございました