Relatório de 50000 registros com Hibernate/Jasper [Resolvido]

Boa tarde a todos!!

Preciso gerar um relatório com aproximadamente 50000 registros. Estou usando banco Oracle 9g, PL/SQL na query e a tabela consultada não tem relacionamentos.

O cache de segundo nível do hibernate está configurado da seguinte forma:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_query_cache">true</property>

Mesmo com cache o hibernate não consegue trazer os dados.

Alguma sugestão?

JDBC??? hehehehehe

ola!

o que quer dizer com ‘nao consegue trazer os dados’?

se vc nao precisa ter todos os dados em memoria ao mesmo tempo, pode ir simplesmente pegando de pouco em pouco.

da uma procurada sobre StatelessSession e ScrollableResults. podem te ajudar…

sergio

Ele literalmente não consegue, dá uma olhada no código:


Query q = getSession().createSQLQuery(sql);
            
if(cacheable) q.setCacheable(true);
                                         
list = q.list(); //nessa linha ele fica processando eternamente

Vou dar uma pesquisada sobre StatelessSession e ScrollableResults.

Tenta jogar a consult numa thread separada…provavelmente ambos (JDBC e Hibernate) vão demorar muito. Não vejo necessidade de trazer 50000 registros de uma só vez…se for para alguém ler ninguém tem essa capacidade e ainda q seja para outros objetivos vc poderia dar um select count(*) from tabela…dividir o total de registro e trazer em pedaços.

Com scrollable results eu consegui obter os registros e passá-los para uma collection mas agora eu tenho que mandar esta collection para um relatório que é um jasper (JRBeanDataSource). Se eu mandar a collection inteira de uma vez ocorre o famoso: java.lang.OutOfMemoryError: Java heap space.

Vou procurar alternativas… se alguém tiver alguma sugestão, por favor habilite-se.

Muito obrigado Sérgio, obrigado a todos.

vc fez o finetune da jvm ??

exemplo

1Gb de heap

java -Xmx1024GB…

Relatório com 50 mil registros com Hibernate e Jasper?
Será que essa não é uma solução inviável?

http://www.javalobby.org/articles/hibernatequery103/

[quote=danieldestro]Relatório com 50 mil registros com Hibernate e Jasper?
Será que essa não é uma solução inviável?[/quote]
Ou melhor…
Quem é que vai ler/averiguar/analisar um relatório de 50 mil registros ?
Não seria chuncho tecnológico sem fins de usabilidade ?

[quote=nbluis][quote=danieldestro]Relatório com 50 mil registros com Hibernate e Jasper?
Será que essa não é uma solução inviável?[/quote]
Ou melhor…
Quem é que vai ler/averiguar/analisar um relatório de 50 mil registros ?
Não seria chuncho tecnológico sem fins de usabilidade ?[/quote]

Na hora que o responsável pelo projeto me pediu esse relatório eu também estranhei… mas ordens são ordens, ele disse que quer.

Vou experimentar o finetune como o qmx sugeriu e vou dar uma lida nesse artigo:

http://www.javalobby.org/articles/hibernatequery103/

O tal artigo que lhe passei do JavaLobby indica que você pode usar o Hibernate para recuperar os registros de forma paginada, de forma que você não precise ficar com os 50000 registros de uma vez na memória. Ele deu um exemplo com o JasperReports, mas a maneira de fazer sugere o que deve ser feito para sua solução de relatórios.

[quote=thingol]O tal artigo que lhe passei do JavaLobby indica que você pode usar o Hibernate para recuperar os registros de forma paginada, de forma que você não precise ficar com os 50000 registros de uma vez na memória. Ele deu um exemplo com o JasperReports, mas a maneira de fazer sugere o que deve ser feito para sua solução de relatórios.
[/quote]

Vou ler este artigo, muito obrigado Thingol

Implementei as soluções oferecidas pelo Hibernate (StatelessSession e Scrollable Results) utilizando a arquitetura sugerida no artigo. O autor propõe um acoplamento do Hibernate com o Jasper… bem interessante.

A carga dos dados e o processamento do relatório realmente ficaram mais performáticos. Mas mesmo aumentando o heap da VM, ela não aguenta um relatório desse tamanho…

Estou estudando o “virtualizador de relatórios” do Jasper, se alguém souber de mais uma alternativa por favor manifeste-se.

Com o JRFileVirtualizer foi possível gerar o relatório mas vou fazer mais testes para ver se é estável.

um relatório com 50k registros não vai ser lido por ninguem, por tanto é inútil, então não deveria existir …
a única desculpa é utiliza-lo como uma forma de arquivamento de dados (uma forma burra, mas fazer o que …)
mesmo assim, acho que deveria argumentar com o chefe, dizendo que este vai ser o relatório mais inútil do sistema :smiley:

Eu estou meio alheio a parte de regras de negócio desse sistema mas por se tratar de um cliente telecom, o volume de dados é fora do padrão. Segundo o responsável pelo projeto é comum relatórios desse porte ou ainda maiores neste ramo. O cara tem 10 anos de experiência de desenvolvimento em telecom… :shock:

OK, mas ninguem vai ler este relatório todo, ou pelo menos eu acho muito pouco provável …
e se ninguem for ler, ele é inútil …
Exceto no caso de ser um demonstrativo para enviar para alguma coisa …
Acho que antes de implementar valeria primeiro perguntar se alguem vai ler esta porquera :smiley:

Tem razão mas como diz a turma aí: “Ordens são ordens” :-o

Eu lembro da minha mãe vendo relatórios de quase 100 páginas lá no banco que ela trabalhava. Isso nos anos 80.
Conferência manual? Que era esse povo vive?