2

ここからダウンロードできる最小限のWebアプリがあります(6Kb): http ://www.mediafire.com/?6vo1tc141t65r1g

関連する構成は次のとおりです。

-eclipselink 2.3.2

-サーバーはtomee1.0です(ただし、glassfish 3.1は同じです)

ページを押してF5キーを押すと、繰り返し更新されます。

http://localhost:8080/testCache/jsf/test.xhtml

コンソールにそのような行がいくつか表示されます

[EL Fine]:2012-08-29 19:01:30.821--ServerSession(32981564)--Connection(27242067)--Thread(Thread [http-bio-8080-exec-12,5、main])- SELECT id、tasktype FROM tasktype

また、スニファを実行すると、SQL要求が常にサーバーに送信されることがわかります。ただし、Eclipselinkのレベル2キャッシュは、データベースにクエリを実行せずに結果(テーブル内の5行)を返します。では、何が問題なのですか、キャッシュをアクティブ化するにはどうすればよいですか?

ファイルからの抜粋

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="xxxPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>microsoft</jta-data-source>
    <properties>

        <property name="eclipselink.logging.level" value="FINE"/>
      <property name="eclipselink.logging.parameters" value="true"/>

    </properties>
  </persistence-unit>
</persistence>

クエリを実行するEJB

/**
 * Some useless class required to use JTA transactions
 * 
 * @author Administrator
 * 
 */
@Stateless
public class Facade {
    @PersistenceContext(unitName = "xxxPU")
    private EntityManager em;


    public List findAll(Class entityClass) {
        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return em.createQuery(cq).getResultList();
    }

    public EntityManager getEntityManager() {
        return em;

    }

}

エンティティBean:

@Entity
@Table(name = "tasktype")

public class TaskType {

    @Id

    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "tasktype")
    private String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
4

1 に答える 1

5

L2 共有キャッシュは、ID ごとにオブジェクトをキャッシュします。find() 操作と Id によるクエリはキャッシュ ヒットを取得しますが、他のクエリは取得しません。結果のオブジェクトは引き続きキャッシュで解決されるため、オブジェクトがキャッシュされると、リレーションシップに対する追加のクエリは発生しません。

クエリでキャッシュを有効にするか、(2.4 では) Id 以外のフィールドにインデックスを付けるか、メモリ内でクエリを実行できます。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Cachingを参照して ください。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cache

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Options

于 2012-08-29T12:35:42.150 に答える