众所周知,期望大型结果集的PostgreSQL查询最好执行设置自动提交和ResultSet.TYPE_FORWARD_ONLY(参见here)。但是,如何使用Spring JPA和EclipseLink实现这一点?有没有人经历过这个(特别是设置自动提交)?
干杯, 斯特芬
答案 0 :(得分:1)
JPA提供程序应该处理低级连接细节,就像你正在谈论的那样。在JPA中,您可以通过在Query接口上调用setMaxResults()方法来限制返回的行数。然后,您可以使用setFirstResult()在运行时翻译结果集。 EclipseLink中的Postgres方言实现负责尽最大努力使与postgres的通信尽可能有效。
http://download.oracle.com/javaee/5/api/javax/persistence/Query.html
答案 1 :(得分:0)
autocommit off是默认模式。否则,您无法实现交易。我很确定结果集也只是默认转发。
答案 2 :(得分:0)
以下似乎对我有用。关键部分似乎是QueryHints.JDBC_FETCH_SIZE。此外,不缓存结果数据有很大帮助。
Query q = em.createNamedQuery("name");
q.setHint(QueryHints.CURSOR, HintValues.TRUE);
q.setHint(QueryHints.CURSOR_PAGE_SIZE, 1000);
q.setHint(QueryHints.MAINTAIN_CACHE, HintValues.FALSE);
q.setHint(QueryHints.JDBC_FETCH_SIZE, 1000);
CursoredStream cursor = (CursoredStream)q.getSingleResult();
while(cursor.hasNext()) {
MyObject o = (MyObject)cursor.next();
// do something wit data
}