OpenJPA2.2.1でglassfish3.2.2を使用しています
私のpersistence.xmlには次のものがあります。
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="openjpa.QueryCache" value="true(CacheSize=10000, SoftReferenceSize=1000)"/>
<property name="openjpa.DataCache" value="true(CacheSize=20000, SoftReferenceSize=1000)"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
</properties>
@Cacheable
アノテーションを持つエンティティのみをキャッシュしたい。
ただし、アノテーションのないエンティティで名前付きクエリを実行した後、@Cacheable
その名前付きクエリを再度実行すると、クエリキャッシュから結果が返されます。
エンティティに対して直接検索を実行すると、データキャッシュからエンティティが取得されません。
では、なぜ@Cacheable
エンティティがデータキャッシュに入れられるのを防ぐのに、クエリキャッシュに入れるのを妨げないのでしょうか。
アノテーションを持たないすべてのエンティティが@Cacheable
クエリキャッシュに入れられないようにする方法はありますか?
擬似コード
エンティティクラス:
@NamedQueries ({ @NamedQuery(name="MyEntity.getByName", query="select e from MyEntity e where e.name = :name")})
@Entity
public class MyEntity
{
@Id
@Column
private long id;
@Column
private String name;
}
EJB:
@Stateless
public class MyEJB
{
@PersistenceContext
EntityManager em;
public MyEntity getEntityByName(String name) {
TypedQuery<MyEntity> namedQuery = em.createNamedQuery("MyEntity.getByName", MyEntity.class);
namedQuery.setParameter("name", name);
return namedQuery.getSingleResult();
}
}
さらに調査すると:
クエリが同じIDを返す限り、クエリキャッシュにあるかどうかに関係なく、同じ結果が得られるため、この問題を見つけるのは難しいかもしれません。
たとえば、データベースに返された行のデータを更新するだけで、新しいデータが返されます。
私の場合、バッチプロセスは行を削除してから、新しいIDで新しい行を再挿入します。したがって、クエリキャッシュは行の元のIDを保存しているので、クエリを実行すると、そのIDが存在しなくなったため、nullが返されるようになりました。クエリキャッシュをクリアすると、新しい行が正しく戻されます。
@Cacheable
したがって、アノテーションを持たないエンティティが最初からクエリキャッシュに入らないようにすると便利です。