1

OpenJPA2.2.1glassfish3.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したがって、アノテーションを持たないエンティティが最初からクエリキャッシュに入らないようにすると便利です。

4

0 に答える 0