【问题标题】:JPA (with EclipseLink) Performance issueJPA(使用 EclipseLink)性能问题
【发布时间】: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


【解决方案1】:

EclipseLink 有许多不同级别的缓存可供使用。我认为查询缓存是您可能正在寻找的描述here http://docs.oracle.com/cd/E25054_01/core.1111/e10108/toplink.htm#BCGEGHGE 并在这里解释了一下 http://wiki.eclipse.org/Introduction_to_EclipseLink_Queries_%28ELUG%29#How_to_Cache_Query_Results_in_the_Query_Cache

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2018-09-15
    • 1970-01-01
    • 2014-01-22
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多