[Problema] EJB retornando ArrayList com muitos dados

Bom dia pessoal!!

Alguém aí teve alguma experiência com ejb retornando grande quantidade de dados via ArrayList para uma aplicação J2SE???

Tenho 1025 objetos dentro da lista de retorno. Quando acesso o método do EJB da minha aplicação J2SE ocorre timeout na operação.

Pelo que ví, o EJB não consegue entregar o retorno do método à tempo e a linha de comunicação é fechada.

Qualquer sujestão será bem vinda!

Obrigado desde já!

Segue o stacktrace:


java.net.SocketException: Software caused connection abort: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.write(BufferedOutputStream.java:109)
	at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1838)
	at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1747)
	at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1249)
	at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1203)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1387)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
	at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1538)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:329)
	at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.sendObjectVersion2_2(JavaSerializationManager.java:120)
	at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.sendObject(JavaSerializationManager.java:95)
	at org.jboss.remoting.marshal.serializable.SerializableMarshaller.write(SerializableMarshaller.java:120)
	at org.jboss.remoting.transport.socket.ServerThread.versionedWrite(ServerThread.java:1006)
	at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:783)
	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:697)
	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:524)
	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:232)

Cara, já tivesse problema.

Mas o problema nem era a quantidade de objetos (que eram bem mais que 1025), mas o tempo em que se levava pra construí-los
Dava timeout em 3 minutos.
Não me lembro exatamente o que fizemos pra contornar isso, mas conseguimos aumentar o valor de time-out pra 30 minutos, além de que paralelo a isso otimizamos todo o processo, criando indices na base, reescrevendo o código mais performático, etc…

Dá uma olhada no tempo de timeout de ejbs no seu servidor de aplicações.

Pois então Tchello, aqui creio que o problema seja apenas na hora de retornar, pois a montagem dos objetos ocorre normalmente e de forma rápida.

Vou verificar as configurações no Jboss.

Vlw!

// método do EBJ stateless
@Override
	public List<Produto> importaProdutos(Date _atualizacao) {
		manager.clear();
		manager.joinTransaction();
		
		ArrayList<Produto> produtos = new ArrayList<Produto>();
		
		if (_atualizacao != null){
			produtos.addAll(manager.createNamedQuery("Produto.atualizados").setParameter("dataAtualizacao", Tools.dateToTimestamp(_atualizacao)).getResultList());
		}else{
			produtos.addAll(manager.createNamedQuery("Produto.findAll").getResultList());
		}
                System.out.println("Produtos recuperados " + produtos.size() ); [b]\\ até aqui o tudo ocorre normalmente[/b]
		return produtos;
	}

Kra, de um modo geral interfaces de granuralidade muito fina impactam negativamente a performance de sistema client/servidor porém no seu caso essa pode ser a melhor opção. Use um EJB Stateful com uma interface q te retorna apenas parte dos dados de cada vez, como uma páginação em um datatable. Assim cada chamada terá apenas o custo de preparar e transferir apenas parte dos objetos.

Fiz um EJB statefull para funcionar como um ResultSet de Objetos para que eu possa navegar pelos resultados. Funcionou perfeitamente!

Vlw pessoal!