繁体   English   中英

Hibernate JPA EntityManager.createQuery() 性能

[英]Hibernate JPA EntityManager.createQuery() performance

我有一个查询,其中包含 2 个“in”子句。 第一个 in 子句需要大约 125 个值,第二个 in 子句查询需要大约 21000 个值。 它使用 JPA CriteriaBuilder实现。

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

Query.getResultList搜索,所有线程都与Query.getResultList性能有关。 他们都没有讨论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 );
        }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM