Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate JPA EntityManager.createQuery()性能_Java_Performance_Hibernate_Jpa_Entitymanager - Fatal编程技术网

Java Hibernate JPA EntityManager.createQuery()性能

Java Hibernate JPA EntityManager.createQuery()性能,java,performance,hibernate,jpa,entitymanager,Java,Performance,Hibernate,Jpa,Entitymanager,我有一个查询,它有两个in子句。查询的第一个in子句大约包含125个值,第二个in子句大约包含21000个值。它是使用JPACriteriaBuilder实现的 查询本身执行速度非常快,并在几秒钟内返回结果。唯一的问题是entityManager。createQuery(CriteriaQuery)大约需要12-13分钟才能返回 我到处搜索,所以所有线程都与Query.getResultList的性能相关。他们都没有讨论entityManager.createQuery(CriteriaQuer

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

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

我到处搜索,所以所有线程都与
Query.getResultList
的性能相关。他们都没有讨论
entityManager.createQuery(CriteriaQuery)
的性能。如果您之前看到过此类行为,请告诉我,如何解决


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

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

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

该成本是在查询注册为命名查询时支付的,还是推迟到第一次执行时支付的,这取决于具体的实现

通过使用

EntityManagerFactory addNamedQuery()

让我们了解结果并祝您好运

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

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

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

希望它能帮助其他人。

好吧,JPA只是一个API,它下面有一个实现,这可能是问题的根源。冬眠?OpenJPA?EclipseLink?您是否尝试分析应用程序(您的工具包或JProfiler或任何其他…)@Gimby:嗯,我们正在使用java-api-6.0 jar中提供的javax.persistence.*中的所有api。我们没有使用任何特定于hibernate的API。我的应用程序部署在JBOSS EAP 6.4上。@hunter:我没有配置我的应用程序。这基本上是一个简单的代码,我知道我的代码卡在哪一行。在这里,我使用entityManager.createQuery()创建TypedQuery对象是的,但是根据数据库的不同,您可以达到其他限制,比如查询的长度。这个策略在我看来是错误的。