JPA getResultList比SQL查询慢得多

时间:2017-08-25 15:25:09

标签: performance jpa eclipselink

我有一个(oracle)表,其中包含大约500万条记录和一个非常复杂的查询,使用像toad这样的数据库工具,在不到5秒的时间内返回大约5000条记录。 但是,当我通过entityManager(eclipseLink)运行查询时,查询运行了几分钟......

我在实施中可能太天真了。 我这样做:

查询query = em.createNativeQuery(complexQueryString,Myspecific.class); ... setParameter ... List result = query.getResultList();

complexQueryString以“SELECT *”开头。

我有哪些优化? 可能只有一个是选择我以后真正需要的字段。一些解释会很棒。

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题(我尝试在不到一秒的时间内读取800列8列的记录),最好的解决办法就是回到jdbc。即使在进行本机查询时,ResultSet的创建和读取速度也比使用JPA快10倍。

如何使用jdbc:通常在J2EE-Servers中,JDBC-DataSource可以作为@Resource注入。

解释:我认为OR-Mappers尝试创建和缓存对象,以便以后可以轻松检测到更改。这是一个非常大的开销,如果您只是使用单个实体,则无法识别。

答案 1 :(得分:0)

Query.setFetchSize(...)可能会有所帮助。它告诉jdbc驱动程序在一个块中返回多少行。只需在getResultList();

之前调用它
query.setFetchSize(5000);
query.getResultList();