# RMI Aufruf und danach Datenbank ?



## der_Client (7. Aug 2007)

Hi,


also folgendes ist Für RMI nötig, was mir auch schlüssig ist:

*1.*  Der Server stellt das entfernte Objekt mit der Funktion bereit. Die Funktion läuft im eigenen Adressraum, und der Server leitet Anfragen an diese Funktion weiter.

*2.* Der Namensdienst (Registry) ist ein Anfragedienst, der Objekte und ihre Methoden mit einem eindeutigen Namen verbindet. Der Server meldet Objekte mit ihren Funktionen bei diesem Namensdienst an. 

*3.* Der Client ist der Nutzer des Dienstes und ruft die Methode auf einem entfernten Objekt auf. Auch er hat einen eigenen Adressraum. Möchte der Client eine Funktion nutzen, so fragt er beim Namensdienst an, um Zugriff zu bekommen. 



Also schreibe ich die interface und impl klasse und kann dies dann mit einer geeigneten client-klasse aufrufen.

nur ist mir jetzt unklar wie ich es bewerkstelligen muss, wenn ich einen datenbank-aufruf via JDBC einbinden will? 
(der aufbau einer datenbank-connection ist mir ebenfalls klar... es geht eher um die verknüpfung von:

clientaufruf --> vom server bereitgestellte methode --> datenbankeintrag)

z.B.:

wenn ich mit dem client zwei parameter übergebe, die dann via weiterleitung auf der serverseite ausgewertet werden..... das ergebnis etc. soll nun in eine datenbank geschrieben werden, oder zur auswertung der methode muss etwas aus der datenbank ausgelesen werden etc.


muss ich das dann in der impl-klasse bzw. in der dort implementierten methode eintragen? und wenn ja wie?



grüße  :wink:


----------



## tuxedo (7. Aug 2007)

Kann es sein dass du viel zu kompliziert denkst? 

Wenn du RMI-Serverseitig eine DB benutzen willst dann hast du da ja Schreib und Lese-methoden für die DB.. Eben irgendwelche Getter und Setter die Daten in die DB reinschieben und wieder auslesen.

Und diese Methoden stellst du in deinem Serverobjekt via RMI den Clients zur Verfügung. Fertig. Wo ist da das Problem?


----------



## der_client (7. Aug 2007)

ich glaube dann denke ich richtig, nur drück ich mich etwas verwirrt aus  :autsch: 


also im prinzip greift der client eben auf die server-methoden (in der Impl-Klasse) zu, welche dann wiederrum auf die DB zugreifen?


----------



## tuxedo (7. Aug 2007)

Jepp. Und nochmal anders ausgedrückt:

Der Client greift im Namen des Servers auf die Methoden zu. D.h. die Servermethoden, die via RMI bereitgestellt werden, laufen nicht im Kontext des Clients, sondern im Kontext des Servers.

Im Fall eines DB Zugriffs wäre es ja auch blödsinnig beim Client den DB-Zugriff via JDBC zu konfigurieren. 

- Alex


----------



## L-ectron-X (7. Aug 2007)

So ist es, nur dass du die Methoden aufrufst, als wären sie Teil des Clients.


----------



## der_Client (7. Aug 2007)

ja, dass nicht der client den jdbc zugriff ausführt war mir klar...


in dem fall muss aber die impl-klasse eine verbindung zur DB aufbauen können und die methoden via RMI bereitstellen können?

...dient also quasi als "Verbindungsstück".


----------



## tuxedo (7. Aug 2007)

Je nachdem wie du das ganze verschachtelt und in verschiedene Programmlayer eingeteilt hast: Ja.

Der Server dem die Methode gehört muss die DB-Verbindung kennen und können. Den RMI-Client geht das alles nix an. Der ruft den Krempel nur auf. Deshalb ja auch "*R*emote *M*ethod *I*nvocation".


----------



## der_Client (7. Aug 2007)

genau.

soweit hab ich das ja auch verstanden   

der client ruft die methode auf. RMI.









das wäre in diesem bild der untere teil (nicht identisch da dort mehrere clients sind, aber vom prinzip her)


jetzt muss aber der server die datenbank abfragen. --->



> Der Server dem die Methode gehört muss die DB-Verbindung kennen und können.




und genau da fehlt mir noch der zusammenhang wie das zustande kommt.

die DB-Connection muss ja nur einmal hergestellt werden, oder?


----------



## tuxedo (7. Aug 2007)

der_Client hat gesagt.:
			
		

> und genau da fehlt mir noch der zusammenhang wie das zustande kommt.
> 
> die DB-Connection muss ja nur einmal hergestellt werden, oder?



Haben wir hier je was anderes behauptet? Wann, wie und wo die Verbindung zur Db hergestellt wird ist Sache des Entwicklers vom Server, und hat im übrigen nix mit RMI zu tun. 

Aber das gängige Verfahren wird wohl sein:

- Server startet
- Server baut Verbindung zur DB auf und hält diese
- Client verbindet sich mit Server und bekommt ein Serverobjekt
- Client macht über Methode X des Server-Objekts irgendwas über n-Ecken mit der Datenbank (in Methode X muss nicht sofort ein SQL-Statement stehen. Das ganze kann auch über die verschiedenen Schichten des Servermoodells vom "Network-Layer" hinüber zum "Database-Layer" geleitet werden, und erst in einer tief vergrabenen Methode im Database-Layer wird die DB angesprochen)
- Server wird irgendwann mal herunter gefahren: Zuvor werden RMI-Verbindungen zu den Clients gekappt und die DB-Verbindung geschlossen.

Ich denke damit wäre jetzt alles gesagt. Noch detailierter und genauer kann ichs nicht beschreiben. Bau dir ein HelloWorld-RMI-Beispiel, dann wirst du's selbst feststellen.

Gruß Alex


----------



## der_geläuterte_Client (7. Aug 2007)

perfekt.  :idea:  


nur das wollte ich wissen, vielen dank


----------



## tuxedo (7. Aug 2007)

Das ganze ist eine Designfrage: Du kannst den Server auch so gestalten dass für jeden angedcokten RMI-Client eine DB-Verbindung aufgebaut wird.. Oder noch mal anders: Dass für jede DB Anfrage eine Verbindung aufgebaut und danach wieder beendet wird.

Kommt halt drauf an wie du dein Programm haben willst. Fakt ist und bleibt aber dass der Server die Verbindung regelt (bzw. regeln sollte).

- Alex


----------

