java - 无法使 Eclipselink 2 级缓存工作

标签 java caching jpa eclipselink

我有一个最小的 Web 应用程序,您可以在此处下载 (6Kb): http://www.mediafire.com/?6vo1tc141t65r1g

相关配置是:

-eclipselink 2.3.2

-server是tomee 1.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 行)而不查询数据库。 那么出了什么问题,如何激活缓存呢?

文件中的一些摘录

持久性.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;
    }

}

最佳答案

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

关于java - 无法使 Eclipselink 2 级缓存工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12177750/

相关文章:

java - 如何在 Eclipse Paho 中从 MQTT 读取数据?

java - 即使内存可用,JVM 也会崩溃并出现错误 ='Cannot allocate memory' (errno=12)

Swift/SpriteKit - 有什么方法可以池化/缓存 SKReferenceNodes 吗?

java - ModelMapper - 将 DTO 的属性映射到具有该属性的关系的实体内

java - 如何将查询的结果集映射到表以外的不同实体

Java - 获取一个从100到999的随机数

java - 如何在 Gwt 中获取 @ 的关键代码

php - 使用 PHP 和 MySQL 缓存调整大小的图像的最佳方法

php - 页面浏览量计数器在第一次页面调用时增加 +3(有时 +2),然后 +1,为什么?

java - 使用 JPA 创建唯一并合并数据库中的现有行