JPAのキャッシュでハマる

JPAのキャッシュでハマりました。
仕組みをちゃんと理解していないからだね。

現象

  1. Webアプリケーションでデータ参照
  2. 別処理で該当データ削除
  3. Webアプリケーションで再度同一データ参照
    • データがないはずなのに参照できる

キャッシュと考えれば、当たり前ですな。

原因

  • JPA(EclipseLink)ではL1キャッシュ、L2キャッシュというものがあり、これがデフォルトで有効だから。
    • L1キャッシュは同一スレッド内キャッシュだそうです
    • L2キャッシュは同一JVM内キャッシュだそうです

環境

  • JavaEE7
    • JPA
      • EclipseLink

対策

  • パフォーマンス上どうなんだ、って話はありますがキャッシュを無効化しました。

    • デフォルト無効で、Entityにアノテーションでキャッシュ化とかはできそうです。
      • 参照マスタはキャッシュとか?
  • persistance.xml

<persistence ..>
    <persistance-unit ...>
        ...いろいろ設定
        <shared-cache-mode>NONE</shared-cache-mode>  <=追加

参考URL


わかりやすいJavaEEウェブシステム入門

新品価格
¥3,456から
(2015/7/2 16:27時点)