Newsgroup: it.comp.java
Titolo: Oggetto: RMI e Database.

Sto tentando di fare un piccolo applicativo client/server.
Praticamente con il client richiamo un metodo remoto che dovrebbe
restituirmi un ResultSet derivato da una query fatta ad un database mySql.
Avvio il server e poi il client (ho provato ad eseguire il tutto con il
debug di Eclipse); quando fa il return del metodo sul server , per
restituire
una variabile ResultSet al client, mi da questo errore:
java.rmi.UnmarshalException: error unmarshalling return; nested exception
is:
 java.io.WriteAbortedException: writing aborted;
java.io.NotSerializableException: com.mysql.jdbc.jdbc2.ResultSet
 at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:164)
 at CalendarImpl_Stub.getRst(Unknown Source)
 at CalendarUser.main(CalendarUser.java:24)
Caused by: java.io.WriteAbortedException: writing aborted;
java.io.NotSerializableException: com.mysql.jdbc.jdbc2.ResultSet
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1278)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
 at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:297)
 at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:146)
 ... 2 more
Caused by: java.io.NotSerializableException: com.mysql.jdbc.jdbc2.ResultSet
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
 at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:265)
 at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:271)
 at sun.rmi.transport.Transport$1.run(Transport.java:148)
 at java.security.AccessController.doPrivileged(Native Method)
 at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
 at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
 at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:7
01)
 at java.lang.Thread.run(Thread.java:536)
This RMI call took milliseconds
Se per voi tutto ciň non č sufficente, provo a postare il codice.
Grazie infinite
  Paolo


Non puoi ritornare un ResultSet direttamente dal server RMI, non e' un oggetto
serializzabile e quindi non e' trasportabile per valore (e tantomeno per reference, non
essendo neanche un oggetto RMI)
Hai un po' di possibilita':
(1) copia il contenuto del resultset in un oggetto serializzabile (da un semplice 
Vector a un oggetto + complesso, hai molte opzioni) e quindi trasportabile per valore
(2) usa un driver JDBC apposito, come ad esempio RMIJdbc
(
http://www.objectweb.org/rmijdbc/
)
(3) crea tu un oggetto remoto anonimo ed usalo per mantenere uno stato temporaneo sul
server mentre tu leggi dal client, usandolo quindi per trasportare il resultset per
riferimento
Nel tuo caso la soluzione (2) mi sembra + adatta, non devi scrivere codice e funziona
senza problemi (vedi anche questo mio vecchio messaggio su usenet
http://groups.google.com/groups?q=rmijdbc+bossola&hl=en&lr=&ie=UTF-8&selm=3b7cf294.1395869904%40MI008IT-EFD01&rnum=1
), se sei un po' piu' esperto (ma su RMI non mi sembra :-D) allora passerei alla (3). La
(1) la considererei solo per query molto piccole, passare un grosso oggettone per valore
in modo incontrollato di solito non e' un buon affare :-)
Ciao,
    Bruno.
---
| Bruno Bossola 
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
|
| Membro del JUG Torino - 
http://www.jugtorino.it
| 

 in modo incontrollato di solito non e' un buon affare :-)
Com'č che quelli inesperti come me li sgamate subito???
Scherzi a parte: sei stato molto esauriente. Ho appena scaricato RMIJdbc e
provo ad usarlo.
Ti ringrazio infinitamente
            Paolo

Se vuoi esiste un progetto che fa proprio quello che vuoi far tu: Zeus... lo
trovi in 
http://www.javalab.it
Son disponibili anche i sorgenti a richiesta.
Buono studio!
--
--------------------------------
Andrea Musumeci
system architect freelance
work: 
http://www.javalab.it
--------------------