ResulSet

7 respostas
E

um método synchronized retorna um objeto ResultSet, mas ocorre a seguinte exceção:

java.rmi.UnmarshalException:error unmarshalling return
java.io.NotSerializableException: com.mysql.jdbc.jdbc2.ResultSet

qual a causa?

7 Respostas

Bani

Como está esse código?
O método que retorna o objeto e o que recebe estão rodando na mesma máquina?
O problema aí é estar faltando o implements Serializable na classe do ResultSet do seu driver, mas isso é algo que você não vai conseguir colocar, então é melhor você enviar o conteúdo desse ResultSet através de algum outro objeto, cuja classe seja serializável.

cv1

Nao adianta nem pensar em marcar os ResultSets como Serializable. Eles nao sao Serializable, nao devem ser serializable, e nem eh tao simples assim torma-los serializaveis :smiley:

Mas, se vc quer passar os dados que retornaram do banco pra frente, tem um pequeno pattern que ajuda aqui: MVC :slight_smile:

E

não seria melhor eu criar um bloco sincronizado ao invés de sincronizar o método e fora deste bloco retornar o ResultSet?

Exemplo

public ResultSet consulta(int codigo){

…bloco sincronizado com uma consulta ao banco de dados…

return rs;
}

TedLoprao

O que exatamente vc está fazendo com um ResultSet, parece estar passando ele por uma conexão RMI.
É isso!!

E

exatamente!

cv1

Eddie, acho que vc ta confundindo sincronizacao com serializacao.

Serializacao de ResulltSets (o que acontece quando vc passa um ResultSet pela rede ou grava usando um java.io.ObjectOutputStream) e’ impossivel, ja que o ResultSet depende de uma Connection, que depende de uma conexao de rede aberta com o banco de dados.

Ao contrario do que talvez alguns anos de lavagem cerebral de VisualBasic possam ter te ensinado, passar um ResultSet (ou RecordSet) pela rede e’ uma das coisas mais panacas que vc pode fazer num sistema: a conexao vai continuar aberta ate o cliente remoto fechar a dita cuja - e, com certeza, ele nao precisa de uma conexao aberta, ele so precisa dos dados!

Nesse caso, o que vc pode, e deve, fazer, eh copiar os dados do ResultSet para uma Collection, e passar a Collection ao inves do RS. Eh uma boa ideia copiar os dados pra um monte de beans (ou DynaBeans) e passar um Set ou List desses beans pro cliente remoto. Fica bem mais limpo, uma vez que o seu cliente nao eh obrigado a conhecer a estrutura do banco de dados (e, na verdade, ele nem deve ter acesso a isso, se vc esta numa arquitetura n camadas ;))

TedLoprao

É isso mesmo que o cv falou, esse tempos atrás eu cai na mesma dúvida que vc e cheguei ao seguinte resultado: Percorri meu ResultSet e carreguei seus dados em uma Collection, em seguida passei esta minha Collection para a aplicação requisitante… Desta forma trabalhei diretamente com uma estrutura de Collection… E funcionou perfeitamente… No meu caso trabalhei diretamente com Collections, e não da forma que o cv indicou (usando beans) entretanto gostei bastante da idéia.

Mas agora eu tenho que perguntar uma coisa, se usasse um Collection com vários beans internos, eu não perderia a possibilidade de tratar o retorno mais genericamente??? :?:

Tipo assim, tenho uma classe responsável por mostrar uma tabela com os dados, certo, mas nessa classe não importa o número de colunas que o retorno possui. No meu caso atual eu uso o size do Collection interno (visto que o retorno é um Collection de Collections, hehehe) para definir as colunas. Qual seria a maneira mais correta para poder chegar ao mesmo resultado através de um bean???

Criado 12 de agosto de 2003
Ultima resposta 13 de ago. de 2003
Respostas 7
Participantes 4