Большой результат по запросу PostgreSQL с помощью Spring JPA / EclipseLink - PullRequest
2 голосов
/ 15 марта 2011

известно, что запросы PostgreSQL, ожидающие больших наборов результатов, лучше всего выполнять, отключив автоматическую фиксацию и ResultSet.TYPE_FORWARD_ONLY (см. здесь ). Однако как я могу реализовать это, используя Spring JPA вместе с EclipseLink? Кто-нибудь сталкивался с этим (особенно отключив автоматическую фиксацию)?

Ура, Штеффен

Ответы [ 3 ]

1 голос
/ 15 марта 2011

Поставщик JPA должен обрабатывать детали низкоуровневого соединения, о которых вы говорите.В JPA вы можете ограничить количество возвращаемых строк, вызвав метод setMaxResults () в интерфейсе запроса.Затем вы можете использовать setFirstResult () для пролистывания результирующего набора во время выполнения.Реализация диалекта Postgres в EclipseLink отвечает за то, чтобы сделать все возможное, чтобы коммуникация с postgres была максимально эффективной.

http://download.oracle.com/javaee/5/api/javax/persistence/Query.html

0 голосов
/ 26 февраля 2015

Следующее, кажется, работает для меня.Критическая часть, кажется, 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
 }
0 голосов
/ 15 марта 2011

autocommit off - режим по умолчанию, когда вы используете JPA. Иначе, вы не могли реализовать транзакции. Я почти уверен, что наборы результатов передаются только по умолчанию.

...