キャッシュ

今回はキャッシュについてです。

【前提条件】

[環境]
[その他]
  • JPAの設定が完了している*1

【概要】

JPAではキャッシュを行っていて、
取得したデータはEntityManager上で管理されています。

そのため、EntityManager外で更新されたデータは
EntityManager上では反映されません。

キャッシュ機能をオフにする設定が必要になります。
persistence.xmlの設定とアノテーションによって行います。

【persistence.xmlの設定】

キャッシュの設定はpersistence.xmlで行います。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="blog" transaction-type="JTA">
        <jta-data-source>jdbc/blog</jta-data-source>
        <class>jp.glory.persistence.entity.UserData</class>
        <class>jp.glory.persistence.entity.UserAuthority</class>
        <shared-cache-mode>NONE</shared-cache-mode>
    </persistence-unit>
</persistence>

shared-cache-modeタグを使用することによりキャッシュの設定が行えます。

shared-cache-modeタグで指定できる値は
ALL, NONE, ENABLE_SELECTIVE,DISABLE_SELECTIVE, UNSPECIFIED
です。

■ALL
全てのエンティティがキャッシュされます。

■NONE
全てのエンティティがキャッシュされません。

■ENABLE_SELECTIVE
デフォルトがキャッシュされないようになります。
アノテーションでキャッシュをする設定をしたものは
キャッシュの対象となります。

■DISABLE_SELECTIVE
デフォルトがキャッシュされるようになります。
アノテーションでキャッシュをしない設定をしたものは
キャッシュの対象外となります。


■UNSPECIFIED
shared-cache-modeタグの指定をしない場合の値です。
javax.persistence.spi.PersistenceProviderインターフェイス実装依存のようです。
JPA2.0を実装したライブラリに依存するようです。

アノテーション

アノテーションによる設定は
javax.persistence.Cacheableアノテーションを使用します。

package jp.glory.persistence.entity;

import java.io.Serializable;

import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "sales")
@Cacheable(value = false)
public class Sales implements Serializable {

    private static final long serialVersionUID = 1067393173514970977L;

    @Id
    @Column(name = "user_id")
    private String userId = null;

    @Id
    @Column(name = "goods_code")
    private String goodsCode = null;

    @Column(name = "number_of_articles")
    private int numberOfArticles = 0;

    // アクセサメソッドは省略
}

value属性にtrue/falseで設定を行います。
デフォルト値はtrueです。

persistence.xmlでALL、NONEを指定した場合は
Cacheableアノテーションは無視されます。


== 2017-04-24 ==

コメントの指摘よりキャッシュについて修正。