我目前正在为我的公司做一个项目。使用 Payara 5.201 和 Eclipselink 2.6(技术上(org.eclipse.persistence:org.eclipse.persistence.jpa:2.6.4)。Payara 实例位于我的计算机本地,但必须通过 VPN 连接到数据库。项目中有一些实体只是用于查找值。我正在寻找一种方法,可以从数据库中检索一次查找表的值,同时在方法期间保留本地副本。
下面列出了查找实体,为了空间和清晰度,它已被编辑。
@Entity
@Table(name = "fapermittypes")
@Cache( //not sure if this works
type=CacheType.SOFT, // Cache everything until the JVM decides memory is low.
size=10000, // Use 10,000 as the initial cache size.
expiry=300000, // 5 minutes
isolation=CacheIsolationType.SHARED,
coordinationType=CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS // if cache coordination is used, only send invalidation messages.
)
@NamedQueries({
@NamedQuery(name = "PermitType.findAll", query = "SELECT n FROM PermitType n"),
@NamedQuery(name = "PermitType.findByName", query = "SELECT n FROM PermitType n WHERE n.permittype = :permittypeName")
})
public class PermitType implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="permittype")
private String permitType;
@Column(name="permittypedesc")
private String permitTypeDescription;
...
}
下面列出了引用该实体的实体。
@Entity
@Table(name = "myTable")
@NamedQueries({
@NamedQuery(name = "Permit.findAll", query = "SELECT n FROM Permit n"),
@NamedQuery(name = "Permit.findBytheName", query = "SELECT n FROM Permit n WHERE n.PermitPK.theName = :theName"),
})
public class Permit implements Serializable {
private static long serialVersionUID = 1L;
@EmbeddedId
private PermitPK PermitPK;
...
@ManyToOne
@JoinColumns({
@JoinColumn(name = "permittype", referencedColumnName = "permittype", insertable = false, updatable = false)
})
private PermitType permitType;
...
}
当我在打开监控的情况下将 WAR 部署到 Payara 5.201 时,我注意到它对数据库的影响很大。以下是日志输出的示例。
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
FINE: SELECT permittype, permittypedesc FROM fapermittypes WHERE (permittype = ?)
bind => [GENERAL]
我意识到实体在内部使用 JDBC 准备好的语句并绑定参数,但是是否有某种方法可以在方法期间保留结果的本地缓存。对于包含该对象的不同实体,在幕后会进行大量重复查询。上面的 JDBC 查询的结果是同一个对象。有没有办法让实体管理器在从数据库中获取某些嵌入实体时使用本地缓存。我想要这样的东西:
public void myProcessingMethod() {
// start local cache
doStuff()
// stop cache and free up objects.
}
有办法做到这一点吗?
乔
如果我理解正确,您的主要问题是您想为您的实体创建一个自定义缓存系统。这可以通过编辑 persistence.xml 文件并添加如下行来实现:
<property name="eclipselink.cache.shared.Entity1" value="None"/>
<property name="eclipselink.cache.shared.Entity2" value="None"/>
<property name="eclipselink.cache.shared.Entity3" value="Full"/>
因此,根据上述内容,entityManager 将始终从数据库中获取 Entity1 和 Entity2 并将 Entity3 保留在内存中(本地缓存)。