【发布时间】:2021-05-19 15:26:45
【问题描述】:
我需要从 Postgres 数据库表中过滤掉数据。该查询可以返回数百万个数据,因此无法将数据保存在内存中,因为它会导致 OOME。我尝试使用 ScrollableResult 来批量获取数据,但如在 logs 中看到的那样,正在触发单个查询。下面的sn -p是用来生成的。
@Transactional
public void getObjectUsingScrollable() {
String statement = "select t1.name,t2.address from table1 t1 JOIN table2 t2 ON t1.id=t2.table1Id WHERE t1.status='OPEN' ORDER BY t1.date DESC "
StatelessSession session = ((Session) entityManager.getDelegate()).getSessionFactory().openStatelessSession();
org.hibernate.query.Query query = session
.createNativeQuery(statement);
query.setFetchSize(5);
query.setReadOnly(true);
query.setLockMode("t1", LockMode.READ);
query.setCacheable(false);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
while (results.next()) {
Object obj=results.get(0);
}
results.close();
session.close();
}
我尝试过使用 LockMode.NONE 。 为什么在 while 循环的每 5 次迭代后不会触发查询? 休眠版本 - 5.4.18 Postgres 版本 - 9.4-1200-jdbc41
【问题讨论】:
-
可能是由于 query.setFetchSize(5) 行?尝试更改为 10 并检查。
-
@Alien 我尝试使用以下 fetchSize 值。 5,50,500。
-
好的.. postgres 控制台返回多少行普通 sql 查询?
-
@Alien 5630 行。
标签: hibernate jpa spring-data-jpa spring-data entitymanager