JPA2, getResultList() e cursor na base de dados

4 respostas
E

Olá,

Tenho uma dúvida que possivelmente fará uma boa diferença no desempenho de uma aplicação que estou construindo, explico abaixo:

Quando usamos o JDBC e pegamos o ResultSet e damos um “next” nele, estamos na verdade movendo um cursor no resultado da consulta na base de dados certo? Quando usamos o getResultList da classe Query do JPA2, ocorre o mesmo?

É assim, preciso fazer uma consulta que retorne muitos registros (tá, hoje nem tantos, mas espero que em breve sejam muitos, rsrsr), vou trabalhar 1 registro (como objeto) por vez, não preciso mantê-los na memória nem antes nem depois, mas se o getResultList traz o resultado completo já na memória, a melhor opção seria chamar um método em consulta nativa do SGBD por JDBC.

Caso não seja (resumidamente) como eu mencionei acima, alguém conhece algum método do JPA2 que me retorna um set dessa forma que mencionei?

4 Respostas

Hebert_Coelho

Você pode utilizar NativeQuery e não NamedQuery.

Com o NativeQuery você terá um Array[] como retorno. Isso já adianta?

WRYEL

Alem da opção citada pelo jakefrog.

Tem os querys hints específico do implementador, se for o hibernate que você está usando, você tem o “org.hibernate.fetchSize”

fonte: http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/objectstate.html#d0e1061

Eu nunca usei isso, mas, colocaria na lista de coisas para testar :slight_smile:

Hebert_Coelho

WRYEL:
Alem da opção citada pelo jakefrog.

Tem os querys hints específico do implementador, se for o hibernate que você está usando, você tem o “org.hibernate.fetchSize”

fonte: http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/objectstate.html#d0e1061

Eu nunca usei isso, mas, colocaria na lista de coisas para testar :)


Mas aí não seria a mesma coisa que fazer o abaixo? Query query = em.createQuery("select p from Player p"); query.setFirstResult(startingAt); query.setMaxResults(maxPerPage);Ou tem diferença?

E

@JakeFrog: Trazer o array de Object’s não me solucionaria, ele traria tudo para a memória assim mesmo.

A opção que menciono é usar:

Mas não queria fazer isso pois pretendemos mudar posteriormente o SGBD, que usamos Postgres nessa aplicação, para um SGBD pago.

@WRYEL: Acredito que essa seria a melhor opção, caso eu usasse o hibernate, mas eu uso o EclipseLink.

Pelo que eu entendi, o fetchSize vai dizer quantos registros a Query (objeto da classe Query, não a consulta em si, rsrs) traz cada vez que ela “baixar” informações do banco de dados, mas a mesma Query pode solicitar à base de dados várias vezes o banco de dados para terminar de trazer o resultado da consulta inteira, seria isso?

Se for isso, vou procurar o fetchSize do JPA/EclipseLink, se não for isso, estou pensando em usar “paginação” para trazer esse resultado do banco de dados, o que não gosto nisso é que eu teria que fazer um count antes, e fazer a mesma consulta várias vezes com offset’s diferentes…

Criado 24 de maio de 2012
Ultima resposta 24 de mai. de 2012
Respostas 4
Participantes 3