【发布时间】:2013-01-29 19:39:53
【问题描述】:
我刚刚开始使用 JPA(使用 EclipseLink 实现)。我有一个非常简单的选择查询,比如
(1) entityManager.find(SomeEntity.class, SomeEntityPK); (2) entityManager.createQuery("Select x from SomeEntity x where x.isDefault = true").getResultList();
SomeEntity 表中的记录数约为 50(非常小的表)。
查询 (1) 最初需要 3 秒,但随后的命中只需 200 毫秒。显然缓存在起作用。 然而,Query (2) 的所有调用都需要 2 秒——想知道为什么不使用缓存。我了解查询(那些不使用 Id 或索引的)总是命中数据库,并且从缓存中使用实体关系。
有什么方法可以提高性能吗?一个简单的 JDBC 选择只需
[更新] 我想我已经解决了这个问题。表“SomeEntity”中的列之一是 Oracle XMLType。由于某些问题,我不得不删除此字段,而是使用 CLOB 字段来存储 xml 数据。瞧,JPA 突然开始缓存查询结果。虽然我不知道 JPA 不缓存 XMLType 的原因。
【问题讨论】:
-
entityManager API(find,merge...) 与自定义查询的执行方式不同。 entityManager 将始终尝试从持久性上下文中查找实体。它仅在未在持久性上下文中找到实体时才查看 DB。一旦实体实例被加载到持久性上下文中,它就会被缓存,直到事务提交或手动刷新持久性上下文。这就是为什么第二个查询要快得多的原因。自定义查询每次都会通过持久化上下文缓存与数据库交互。
标签: jpa jpa-2.0 eclipselink