我有一个最小的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--服务器会话(32981564)-连接(27242067)-线程(线程[http-bio-8080-exec-12,5,main])-选择
id,任务类型FROM任务类型
通过运行嗅探器,我发现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;
}
}
最佳答案
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/