キャッシュ
今回はキャッシュについてです。
【前提条件】
[環境]
- JDK 1.7.0_07
- Glassfish 3.1.2.2
- PostgreSQL 9.1(JDBC:postgresql-9.1-901.jdbc4.jar)
【概要】
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 ==
コメントの指摘よりキャッシュについて修正。