# Laufen Objekte, die vom Cajo-Server geliefert werden, lokal auf dem Client?



## TheJeed (24. Jul 2010)

Hallo zusammen!

Ich habe ein Problem, das mich etwas verwirrt und ich befürchte, die Funktionsweise von Cajo nicht ganz begriffen zu haben. Für ein kleines Projekt habe ich einen Cajo Client und Server geschrieben. Der Server stellt einen Service zur Verfügung, von dem wiederum eine Methode dazu dienen soll, ein Adressobjekt in eine db4o-Datenbank zu schreiben.

Beim Start des Servers wird meine Datenbankverbindung initialisiert, d.h. ich rufe "getInstance()" meiner als Singleton konzipierten DB-Helferklasse auf. Dabei wird die entsprechende DB-Datei in einem Server-Unterverzeichnis geöffnet. So weit, so gut.

Wenn ich nun auf dem Client die Methode "storeAdress" aufrufe, die vom Server bereitgestellt wird, soll folgendes geschehen:

```
//diese Methode wird vom Client remote aufgerufen
public void storeAddress(Address a){
  DBConnector dbc=DBConnector.getInstance();//DBConnector ist die Singleton-DB-Helferklasse
  dbc.storeAddressObject(a); 
}
```
Nun dachte ich mir:"In der ersten Zeile wird das vom Server instanziierte Helferklassenobjekt zurückgegeben." Das ist aber nicht der Fall und es hat zur Folge, dass noch eine Instanz des Singletons(im Kontext des Clients?!) erzeugt und die Datenbank neu geöffnet wird. Allerdings so, als würde sich das Objekt auf dem Client befinden - es sucht auch nicht mehr in einem Unterverzeichnis des Servers, sondern des Clientprogramms nach der DB-Datei zum Öffnen. 

Baut Cajo das Objekt meiner Helferklasse tatsächlich noch ein zweites Mal lokal? Wie kann ich in dem Fall dafür sorgen, dass das Serverprogramm und der Cajo-Client auf die selbe Objektinstanz zugreifen können? 

Ich wäre für nen denkfördernden Klapps auf den Hinterkopf sehr dankbar  

Beste Grüße,

David


----------



## FArt (28. Jul 2010)

Sie sollten auf dem Server "laufen". Du kannst sie nicht einfach an den Client weitergeben.

RMI


----------



## TheJeed (28. Jul 2010)

Ja, das ist eben auch meine Meinung gewesen. Ich habe mittlerweile an mehreren Stellen gelesen, dass man das Prinzip, das hinter RMI steht, als "weak code mobility" bezeichnet. Dort verhält es sich so, dass die zur Verfügung gestellten Methoden im Serverkontext laufen.

Cajo scheint aber dem Prinzip "strong code mobility" zu folgen und nicht nur die Daten- und Ergebnisobjekte an den Server zu senden, sondern den kompletten Code auf den Clientkontext zu verfrachten.

Ich hab mein Problem jetzt erstmal über gutes altes RMI gelöst. Trotzdem werd ich mich mal hinsetzen und noch ein Cajo Beispiel schreiben um zu sehen, wie das nun wirklich läuft. Ich stelle es dann hier mal zur Verfügung.


----------



## HoaX (29. Jul 2010)

Nö, Cajo macht das gleiche wie RMI, läuft bei uns ohne Probleme.


----------



## tuxedo (29. Jul 2010)

Ergänzung:



			
				http://de.wikipedia.org/wiki/Cajo hat gesagt.:
			
		

> Das Projekt cajo ist eine kleine, freie Java-Klassen-Bibliothek. Sie ermöglicht die Kooperation zwischen mehreren virtuellen Maschinen. *Das Ziel ist die Vereinfachung des Gebrauchs von RMI.*



Ergo: Cajo ist nach wie vor "*Remote *Procedure Call" (RPC), nur eben angeblich einfacher als bei RMI. Und nicht "Transfer Remote Procedure to Local and Call it Locally". Stell ich mir insgesamt auch schwer vor. Denn das Remote-Objekt hat ja einen ganz eigenen Kontext auf dem Server. Den müsste man auf dem Client ja auch erstmal herstellen, bevor man die Methoden dann aufrufen könnte...

Schlussfolgerung: Ist und bleibt RPC


----------

