我有一个 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;
}
答案 0 :(得分:0)
所有JPA提供程序都有QueryHints
来进行某些查询优化。它使您能够在单个查询或使用联接中获取所有关联。例如,在EclipseLink中,您可以使用QueryHints.BATCH
在单个查询中获取所有one to many
或many to many
关联。
代替使用findAll()
,在您的实体中创建您自己的查询,并提供特定于休眠的适当查询提示。 join-fetch
会花费很多时间,因为您有很多相关实体。尝试使用batch-fetch
,因为它会减少查询数量并有效地加快获取速度。
您可以了解有关休眠特定的获取策略here
的更多信息