我的查询中包含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来测试我的代码。如果您需要更多信息,请告诉我。
答案 0 :(得分:0)
混合方法是动态创建查询,然后将其另存为实体管理器工厂中的命名查询。
此时它就像任何其他可能已在元数据中静态声明的命名查询一样。虽然这似乎是一个很好的妥协,但事实证明只在少数特定案例中有用。它提供的主要优点是,如果有查询在运行时才知道,但随后重复重新发布。一旦动态查询成为命名查询,它将只承担处理一次的成本。
当查询作为命名查询注册时,是否支付成本,或者直到第一次执行时才支付成本,这是特定于实现的。
可以使用
将动态查询转换为命名查询EntityManagerFactory addNamedQuery()
通过结果和好运告诉我们
答案 1 :(得分:0)
我观察到,使用21个IN子句(每个包含1000个表达式)进行单个查询并且所有结合OR子句,使查询运行得更慢。我尝试了另一种方法来执行每个IN子句作为单独查询的一部分。因此,这21个单独的查询总体上表现得更好。
我观察到的另一个问题是,当结果集很大时(结果集中的20K行),使用CriteriaBuilder的查询速度很慢。我通过向查询类型查询添加查询提示来解决此问题:
TypedQuery.setHint("org.hibernate.fetchSize", 5000);
希望它能帮助别人。