• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

afilipebarbosa

JAVA RMI e ResultSet

6 mensagens neste tópico

Boas amigos,

estou a começar a trabalhar em JAVA RMI, e após a fase inicial de adaptação a esta nova tecnologia (pelo menos para mim), estou a ter uns problemas..

Após criar aquela treta da classes que liga a base de dados mysql através do driver xpto, corri o servidor registando no Naming o objecto como normalmente se faz.. até aqui tudo bem, o problema é que um método dessa classe/interface devolve um ResultSet. E segundo o java esse ResultSet não pode ser transmitido através do rmi, dando o seguinte erro:

Erro: java.rmi.UnmarshalException: error unmarshalling return; nested exception is:

    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.mysql.jdbc.JDBC4ResultSet

Já tentei procurar no google, mas de todos os casos que vi, ninguém deu uma possível solução, tirando a de não retornar o ResultSet lol.

De qualquer forma gostava de saber se alguém tem ideia de como resolver este problema, pois imagino que este problema seja muito vulgar para quem trabalha com rmi.

Aguardo as vossas respostas.

Cumprimentos

André Barbosa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não trabalho com java, n tou bem dentro do assunto, mas diria q o q deve ser feito é o seguinte:

- Obter o result set através do driver para o mysql como estás a fazer.

- Criar um Array de uma entidade conhecida (ex: OsMeusDados[])

- Usar um dataReader (ou lá cm se chama em java) que passe os dados do result set para os teus campos

(ex: OsMeusDados[0] = new OsMeusDados(); OsMeusDados[0].Nome = rs.Read(...), isto dentro de um while rs.hasNext()) mais uma vez não tou a par de como é isto em java.

- O método RMI deve depois devolver esse array, assim penso q já não vais ter problemas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas bruno1234,

agradeço desde já a tua resposta.

Por acaso também já tinha pensado em colocar o ResultSet numa Hash onde a key eram os atributos da tabela e o valor da key era um arrayList com os respectivos dados. Pensei também criar um novo objecto serializable que tinha como variável um resultSet e devolvia esse objecto em vez do ResultSet.

No entanto, ainda não tentei nenhuma delas, nem sei se realmente funcionam.

De qualquer forma a tua resposta foi sem duvida um apoio àquilo que tinha idealizado. No entanto, vou ficar a aguardar as resposta de outros utilizadores, pois pode haver uma solução mais "directa".

De qualquer forma, gostava de te agradecer mais uma vez pela tua resposta.

Cumprimentos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não há resposta mais directa a esse caso, se o ResultSet não é serializável, então não há forma de o passar através de RMI, já que esta tecnologia usa a serialização como mecanismo de transferência de informação.

A solução passa por retirares todos os dados do ResultSet para dentro de outro objecto, que simule o ResultSet ou que te ofereça a estrutura que necessitas e que implemente obrigatoriamente uma das interfaces de serialização, e depois usar esse objecto.

Lembra-te que a serialização necessita que todos os objectos sejam serializaveis, assim mesmo que coloques o ResultSet dentro de um objecto serializavel, vais ter a mesma excepção. Se um objecto A é composto por outros objectos, não basta que A seja serializavel mas que todos os objectos que constituem A também o sejam, e assim sucessivamente. No fundo, o sistema base de serializacao apenas consegue guardar dados primitivos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque não transformas o ResultSet num objecto? E depois passas o objecto pelo RMI.

para fazer isso tens que criar um objecto igual ao ResultSet. penso que o que queiras passr por RMI seja o resultado de uma qualquer query à BD.

Transformas esse resultado para um objecto e tens o problema resolvido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que a melhor solução é mesmo passar o ResultSet para uma List ou um Map dependendo do tratamento que os dados iram ter. Até pk o ResultSet não é uma estrutura muito boa para trabalhar dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora