Fast Lane Reader - é isso mesmo?

Olá pessoal,

Estou tendo alguns probleminhas com “out of memory” quando chamo um relatorio meio grande, a minha aplicação é swing e utiliza EJB 3.

Já tratei o código de forma a melhorar a performance e uso de memória, já configurei o JBoss para trabalhar com mais memória dedicada à ele, e nada.

Dei uma estudada no pattern “Fast Lane Reader”, mas pelo que eu percebi esse pattern é um “anti-pattern EJB”.

Pelo que eu entendi ele simplesmente “pula” o container EJB e acessa diretamente a DAO.

É isso mesmo? Simplesmente isso?

Se for, na minha opinião não deveria ser chamado de design pattern.

Hoje em dia tudo é chamado de design pattern, daqui a pouco um simples if será um novo design patter, sinistro isso…

ou estou enganado?

Fastlane Reader - Leitor via-rápida é isso mesmo, ele pula o máximo possivel para ser o mais rapido possivel. Na realidade é uma implementação particfular de um adptador.

Não sei pq seu relatorio estoura a memoria. Se o seu relatorio é feito com JasperReports, por exemplo, provavelemnte vc já está usadno o Fastlane Reader. Mas se vc está usando algo diferente (é complicado falar muito sem saber o que vc está fazendo ) pense eu usar o JasperReports.

O Fastlane Reader , embora pule camadas ele não viola o encasulamento, desde que, claro, a sua aplicação tenha sido bem desenhada. Em particular se ela é programada contra interfaces e não classes.

Então…

Ainda estou com esse problema.
Estou utilizando EJB 3 e servidor JBoss, é uma aplicação Swing.
O código já foi tratado para “economizar” memória, mas o problema é realmente o tamanho do relatorio (que na minha opinião nem é tão grande assim).

Cara, se voce conhece esse pattern, me mostre como implementá-lo, se possível poste aqui algum exemplo.

Eu já procurei na web, mas existem poucas coisas sobre esse pattern.

Eu só preciso de um empurrãozinho para entender como ele funciona, daí depois eu me viro para implementá-lo aqui.

Seria bom vc explicar o que está fazendo. O que significa “grande” ? 1000 registros ? 50 joins ? 2000 páginas ?
Onde e como vc está criando o relatório e onde e como o está mostrando.
Que tecnologia vc está usando para fazer o relatorio JasperReports ?

é um relatório de 11.000 registros.
ou seja, eu instancio 11.000 objetos e os adiciono numa lista que é passada como parametro para o método do JasperReports.

Mas no meio do processamento ocorre erro de java heap space.
A aplicação é EJB.

Eu estou chamando o relatorio no código que fica na parte cliente da aplicação.
Escrevi o código de forma a minimizar as instancias e objetos utilizados.
Já modifiquei os arquivos de configuração de memória da jvm para o JBoss dedicando 2048mb de memória para ele.

Mesmo assim o erro continua.

Se precisar posso postar parte do código aqui.

Alguém se habilita a ajudar?

A receita do bolo

  1. Crie uma interface para obter o relatorio

interface ReportSource {

    public JasperPrint report generateReportXTZ( .. parametros ..) {
          // implementação
   }

}

O objeto JasperPrint é um objeto consolidado, ou seja, o report já pronto.
Ele consome menos memória que os objetos que lhe dão originem. Pense neste objeto como a imagem do report. Ele é serializável.

Esta interface deve ter duas implementações. Uma para rodar no servidor outra para rodar no cliente. A do cliente delega para a do servidor. O unico objeto a transitar é o objeto report do tipo JasperPrint. A delegação pdoe ser HTTP ou RMI como preferir. Pode usar um Stateless Bean para isto, se quiser.

  1. Não use uma list. Use um ResultSet. Faça o seu SQL na mão e obtenha um ResultSet (isto vai matar o problema do numero de registros)

Isto irá resolver o seu problema.
Dê uma olhada na documentação do JasperReports em especial as classes JasperManager e JasperPrint