Hibernate JPA EntityManager.createQuery() 性能

Hibernate JPA EntityManager.createQuery() performance

我有一个包含 2 'in' 个子句的查询。第一个 in 子句大约有 125 个值,第二个 in 子句的查询大约有 21000 个值。它是使用 JPA CriteriaBuilder.

实现的

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

我搜遍了SO,所有线程都与Query.getResultList的性能有关。 None 人讨论了 entityManager.createQuery(CriteriaQuery) 的性能。如果您之前看到过此类行为,请告诉我如何解决。

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

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

在这一点上,它变得就像可能已在元数据中静态声明的任何其他命名查询一样。虽然这似乎是一个很好的折衷方案,但事实证明它仅在少数特定情况下有用。它提供的主要优势是,如果有查询直到运行时才知道,但随后会重复发出。一旦动态查询成为命名查询,它只会承担处理一次的成本。

具体是在查询注册为命名查询时支付费用,还是推迟到第一次执行时支付费用。

可以使用

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

让我们知道结果并祝你好运

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

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

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

希望对其他人有所帮助。

Hibernate 中的代码预计不会用于绑定大量参数:

        for ( ImplicitParameterBinding implicitParameterBinding : parameterMetadata.implicitParameterBindings() ) {
            implicitParameterBinding.bind( jpaqlQuery );
        }

不幸的是,如果你想做类似的事情,你需要找到不同的方法。