Hibernate JPA EntityManager.createQuery()性能

时间:2016-08-29 09:15:54

标签: java performance hibernate jpa entitymanager

我的查询中包含2''条款。 First in子句大约需要125个值,而查询子句中的第二个大约需要21000个值。它使用JPA CriteriaBuilder实现。

查询本身执行速度非常快,并在几秒钟内返回结果。唯一的问题是entityManager.createQuery(CriteriaQuery)需要大约12-13分钟才能返回。

我搜遍所有SO,所有线程都与Query.getResultList的性能相关。他们都没有讨论entityManager.createQuery(CriteriaQuery)的表现。如果您之前已经看过这种行为,请告诉我,如何解决。

我的JDK版本是1.7。 javaee-api的依赖版本是6.0。应用程序部署在JBOSS EAP 6.4上。但是现在这不是问题,因为我使用连接到实际Oracle数据库的EntityManager使用junit来测试我的代码。如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

混合方法是动态创建查询,然后将其另存为实体管理器工厂中的命名查询。

此时它就像任何其他可能已在元数据中静态声明的命名查询一样。虽然这似乎是一个很好的妥协,但事实证明只在少数特定案例中有用。它提供的主要优点是,如果有查询在运行时才知道,但随后重复重新发布。一旦动态查询成为命名查询,它将只承担处理一次的成本。

当查询作为命名查询注册时,是否支付成本,或者直到第一次执行时才支付成本,这是特定于实现的。

可以使用

将动态查询转换为命名查询
EntityManagerFactory addNamedQuery()

通过结果和好运告诉我们

答案 1 :(得分:0)

我观察到,使用21个IN子句(每个包含1000个表达式)进行单个查询并且所有结合OR子句,使查询运行得更慢。我尝试了另一种方法来执行每个IN子句作为单独查询的一部分。因此,这21个单独的查询总体上表现得更好。

我观察到的另一个问题是,当结果集很大时(结果集中的20K行),使用CriteriaBuilder的查询速度很慢。我通过向查询类型查询添加查询提示来解决此问题:

TypedQuery.setHint("org.hibernate.fetchSize", 5000);

希望它能帮助别人。