2011-03-14 3 views
2

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

Приветствия, Штеффен

ответ

1

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

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

+0

Действительно ли это стандартный способ сделать это? Если я сравню с java.sql.ResultSet, я могу определить размер выборки, который автоматически учитывается при повторении по набору результатов. Нужно ли мне делать это (более или менее) вручную (хотя это просто) при использовании Spring JPA? – Steffen

0

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

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 
} 
Смежные вопросы