已知大型結果集的PostgreSQL查詢最好執行設置爲關閉自動提交和ResultSet.TYPE_FORWARD_ONLY(請參閱here)。但是,如何使用Spring JPA和EclipseLink一起實現這一點?有沒有人有這方面的經驗(尤其是設置自動關閉)?使用Spring JPA/EclipseLink PostgreSQL進行查詢的結果很大JPA/EclipseLink
乾杯, 斯特芬
已知大型結果集的PostgreSQL查詢最好執行設置爲關閉自動提交和ResultSet.TYPE_FORWARD_ONLY(請參閱here)。但是,如何使用Spring JPA和EclipseLink一起實現這一點?有沒有人有這方面的經驗(尤其是設置自動關閉)?使用Spring JPA/EclipseLink PostgreSQL進行查詢的結果很大JPA/EclipseLink
乾杯, 斯特芬
的JPA提供商應該是在處理低級別的連接細節,如你所談論的那些。在JPA中,您可以通過在Query接口上調用setMaxResults()方法來限制返回的行數。然後可以使用setFirstResult()在運行時遍歷結果集。 EclipseLink中的Postgres方言實現負責儘可能地儘可能有效地與postgres進行通信。
http://download.oracle.com/javaee/5/api/javax/persistence/Query.html
自動提交設置爲你使用JPA時的默認模式。否則,您無法執行交易。我很確定結果集只在默認情況下才轉發。
以下似乎是爲我工作。關鍵部分似乎是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
}
這真的是標準的做法嗎?如果我與java.sql.ResultSet比較,我可以定義一個讀取大小,在迭代結果集時會自動考慮它。在使用Spring JPA時,我是否真的需要手動(或多或少)(儘管很簡單)? – Steffen 2011-03-17 00:20:03