Java - Spring - Hibernate从数据库中提取1000个对象需要很长时间

时间:2018-03-21 08:02:31

标签: java database spring performance hibernate

我有一个 Postgres数据库,其中17个表由Hibernate创建,其中 @Entity 注释,并且运行 CrudRepository 并使用 findAll 从数据库中提取对象的方法

一切正常,直到我尝试从数据库中检索1000 +对象需要27秒。检索600个对象大约需要10秒钟。

时间呈指数级增长,我想知道是否有解决方案,我知道如果我尝试连接表,它会加快进程,但加入17个表的表是很多工作。除了我正在使用的对象之外,是否还有其他提取方法可以更快地检索对象?

这是我检索对象的方式:

public List<Document> getAllDatabaseDocuments() {
    List<Document> listOfDocs = new ArrayList<>();
    listOfDocs.addAll((List<Document>) sdr.findAll());
    return listOfDocs;
}

1 个答案:

答案 0 :(得分:0)

所有JPA提供程序都有QueryHints来进行某些查询优化。它使您能够在单个查询或使用联接中获取所有关联。例如,在EclipseLink中,您可以使用QueryHints.BATCH在单个查询中获取所有one to manymany to many关联。

代替使用findAll(),在您的实体中创建您自己的查询,并提供特定于休眠的适当查询提示。 join-fetch会花费很多时间,因为您有很多相关实体。尝试使用batch-fetch,因为它会减少查询数量并有效地加快获取速度。

您可以了解有关休眠特定的获取策略here

的更多信息