[Java-RMI-Oracle] Passer un objet OracleDataSource

Passer un objet OracleDataSource [Java-RMI-Oracle] - Programmation

Marsh Posté le 18-02-2002 à 12:29:36    

Bon voilà, au départ, je voulais passer un objet de type Connection entre un client et un serveur avec du RMI. Manque de bol, c'est pas serialisable, et ça me jette. :(
Après quelques recherches, je remarque qu'Oracle a implémenté une classe qui permet de balancer une Connection chez le client, grâce à la classe OracleDataSource.
Manque de bol, j'ai une erreur que je ne comprends pas...
Mon code :  
L'interface :

package test_interf;
 
import java.rmi.Remote;
import java.rmi.RemoteException;
import oracle.jdbc.pool.*;
 
public interface testInterf extends Remote {
 OracleDataSource retourneConn() throws RemoteException;
}

 
Le serveur :

package test_oracle;
 
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.*;
import java.rmi.*;
import java.rmi.server.*;
import test_interf.*;
 
public class testOracle extends UnicastRemoteObject implements testInterf {
 public OracleDataSource cacheOracle;
 
 public testOracle() throws RemoteException {
  super();
  try {
   DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
   cacheOracle = new OracleDataSource();
   cacheOracle.setDriverType("thin" );
   cacheOracle.setServerName("mon_serveur" );
   cacheOracle.setDatabaseName("ma_base" );
   cacheOracle.setPortNumber(mon_port);
   cacheOracle.setUser("mon_user" );
   cacheOracle.setPassword("mon_passe" );
  } catch (Exception e) {
   System.err.println("testOracle() exception:" );
   e.printStackTrace();
  }
 }
 
 public OracleDataSource retourneConn() throws RemoteException{
  return cacheOracle;
 }
 
 static void main(String[] args) {
  java.sql.Connection hop;
  String url = "//linux/test_oracle";
  try {
   testOracle obj = new testOracle();
   Naming.rebind(url, obj);
  } catch (Exception e) {
   System.err.println("testOracle exception :" );
   e.printStackTrace();
  }
 }
}
 
Les compilations passent bien, je lance "rmiregistry", et quand je lance le serveur, il me lance :

testOracle exception :
java.rmi.ServerError: Error occurred in server thread; nested exception is:
        java.lang.NoClassDefFoundError: oracle/jdbc/pool/OracleDataSource
java.lang.NoClassDefFoundError: oracle/jdbc/pool/OracleDataSource
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:245)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:220)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:354)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:160)
        at test_oracle.testOracle.main(testOracle.java:45)
[i]
Je comprends pas :cry:
Si qqun a une idée :jap:

Reply

Marsh Posté le 18-02-2002 à 12:29:36   

Reply

Marsh Posté le 18-02-2002 à 12:34:59    

bin les classes oracles sont pas dans ton classpath tout simplement. Faut les ajouter


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 18-02-2002 à 12:42:20    

Bah si elles y sont :(
En gros, je fais :
unset CLASSPATH
rmiregistry &
export CLASSPATH=/usr/java/lib/classes12.zip:/usr/test/testInterf.jar:.
java test_oracle.testOracle
 
Avec :  
classes12.zip : les classes Oracle (driver thin 8.1.7)
testInterf.jar : l'interface
 
:cry:

Reply

Marsh Posté le 18-02-2002 à 12:49:04    

Ce que je comprends encore moins, ce que si je le relance un 2ème fois juste derrière, il plante différemment :
testOracle exception :
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.io.InvalidClassException: test_oracle.testOracle_Stub; Local class not compatible: stream classdesc serialVersionUID=2 local class serialVersionUID=0
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.io.InvalidClassException: test_oracle.testOracle_Stub; Local class not compatible: stream classdesc serialVersionUID=2 local class serialVersionUID=0
java.io.InvalidClassException: test_oracle.testOracle_Stub; Local class not compatible: stream classdesc serialVersionUID=2 local class serialVersionUID=0
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:245)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:220)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:354)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:160)
        at test_oracle.testOracle.main(testOracle.java:45)
 
Et alors là, je comprends plus du tout :cry:

Reply

Marsh Posté le 18-02-2002 à 12:54:34    

ton skeleton n'est pas à la bonne version. Tu as des vieux skeleton d'une ancienne version. Tu dois les virer et relancer rmic


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 18-02-2002 à 13:07:12    

Oui c'est ce que je m'étais dit au départ.
Mais, même en recompilant tout, ça foire...
En gros, je fais :
export CLASSPATH=/usr/java/lib/classes12.zip:.
javac test_interf/testInterf.java
jar cvf testInterf.jar test_interf/*.class
mv testInterf.jar /usr/test/
export CLASSPATH=/usr/java/lib/classes12.zip:/usr/test/testInterf.jar:.
javac test_oracle/testOracle.java
rmic -d . test_oracle.testOracle
unset CLASSPATH
rmiregistry &
export CLASSPATH=/usr/java/lib/classes12.zip:/usr/test/testInterf.jar:.
java test_oracle.testOracle
 
Et ça merde... :(
Franchement, je vois pas où ça merde...
M'est avis que ça bugge du coté d'Oracle : si je vire l'objet OracleDataSource, évidemment, ça fonctionne :/
Mais je veux passer un objet de type Connection à mon client RMI :cry:

Reply

Marsh Posté le 18-02-2002 à 13:21:53    

tu comprends bien sur que ton client doit avoir les classes oracles installées. SInon il va avoir dur à comprendre ce qu'est un objet OracleDataSource
 
:D
 
c'est fait ca?


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 18-02-2002 à 14:02:50    

darklord22 a écrit a écrit :

tu comprends bien sur que ton client doit avoir les classes oracles installées. SInon il va avoir dur à comprendre ce qu'est un objet OracleDataSource
 
:D
 
c'est fait ca?


:) Vi vi, ça j'imagine, mais bon, pour l'instant, si je pouvais faire fonctionner le serveur, je serais content...

Reply

Marsh Posté le 18-02-2002 à 14:06:17    

je veux bien moi mais si tu as un marshall c'est que tu as invoqués qqch non?
 
Si il te fait ca a l'init (sans que ton client fasse quoi que ce soit) c'est tes skeletons qui sont mauvais.


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 18-02-2002 à 14:10:45    

darklord22 a écrit a écrit :

je veux bien moi mais si tu as un marshall c'est que tu as invoqués qqch non?
 
Si il te fait ca a l'init (sans que ton client fasse quoi que ce soit) c'est tes skeletons qui sont mauvais.  



:??: Euhh, atta.
En gros, moi, tout ce que je fait, c'est instancier un objet du type de mon serveur pour le binder après dans rmi.
En gros, c'est l'instruction Naming.rebind(mon_url, mon_objet); qui merde.
Donc à partir de là, le serveur ne se lance pas. Donc, mon client peut pas trop y accéder.

Reply

Marsh Posté le 18-02-2002 à 14:10:45   

Reply

Marsh Posté le 18-02-2002 à 14:12:13    

alors c tes skeleton qui sont foireux c'est bien ce que je dis ...


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 18-02-2002 à 14:31:32    

Hummm, skeleton foireux... J'vois pas trop comment si je compiles, rmic et exécute dans la foulée...
Ou alors, c'est une des compilations qui déconne ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed