# Daten zwischen 2 Servlets aus 2 Webapplikationen teilen?



## sirbender (20. Dez 2009)

Hi,

ich habe 2 Servlets in 2 Webapplicationen die im selben Tomcat laufen. 

Ich erklaere mal kurz warum ich die 2 Servlets als 2 Webapplikationen deploye anstatt beide in einer. 

Das erste Servlet initialisiert eine grosse Map und beinhaltet sehr viele Resourcen. Ich will das praktisch nur einmal deployen weil dies solange dauert und dann laufen lassen. 

Servlet Nr. 2 soll oft deployed werden. Es wird oft geaendert, ist schlank und das deployen geht schnell. Ich hoffe es leuchtet jedem ein, dass ich beide Servlets - und vor allem nicht die riesigen Resourcen in eine Webapplikation stecken kann.


Nun will ich Daten zwischen den Servlets teilen. Da es sich um 2 Webapplikationen handelt get context.setAttribute(key, Map) ja leider nicht, oder?

Wie kann ich es sonst tun, und wie effizient ist dann dieses das Daten-Sharing? Werden die Daten direkt geteilt oder erst serialisiert und dann zum anfragenden Servlet geschickt?


Danke,
sb


----------



## mvitz (20. Dez 2009)

Wie wäre es anstatt einer Map in Servlet 1 einfach eine Datenbank zu nehmen?


----------



## Noctarius (20. Dez 2009)

Wie wäre es mit einer Art Datenservice über JMS oder ähnliches?


----------



## sirbender (20. Dez 2009)

Hmm...Datenbank steht glaube ich ausser Frage. Oder kann ich eine Datenbank als eine der Applikationen von Tomcat laufen lassen?

Wie wuerde denn eine Loesung ueber JMS funktionieren? Das Problem ist, wenn die Kommunikation zu aufwendig ist, kann ich mir dass mit dem 2ten Servlet auch gleich sparen.


----------



## mvitz (20. Dez 2009)

Du kannst z.B. eine Embedded Datenbank benutzen, wie z.B. H2 oder HSQLDB. Diese speichern alles in einem File und brauchen keinerlei Administration, können somit praktisch aus Tomcat heraus "gestartet und verwaltet" werden.


----------



## sirbender (20. Dez 2009)

Praktisch? Schon mal gemacht? Gibt es dafuer gute Tutorials?


----------



## mvitz (20. Dez 2009)

Ja ist praktisch. Einfach den Treiber mit in der Webapp deployen und dann ganz normal per JDBC drauf zugreifen.


----------



## sirbender (20. Dez 2009)

Kann man dann auch von aussen zugreifen? Oder nur intern?


----------



## mvitz (20. Dez 2009)

Idr. kann immer nur ein Prozess auf einmal auf diese Datenbank zugreifen. Und man kann dann zwar auch von extern wenn man Zugriff auf die Datei hat zugreifen, dann kann allerdings die Webapp in dem Moment nicht darauf zugreifen.


----------



## Noctarius (20. Dez 2009)

Warum willst du die Daten überhaupt in einer Webapp haben? Das hört sich ziemlich nach Designfehler an.


----------



## sirbender (20. Dez 2009)

Die Daten muessen halt von der Webapp gelesen werden. Eine Datenbank wollte ich nicht aufsetzen, da wirklich die Daten nur einmal eingelesen werden muessen.

Wenn ich keine Datenbank will, welche Optionen haetten sich sonst noch geboten? Die Daten irgendwo ausserhalb des tomcat webapps folder speichern..? Kann ich dann irgendwie auf die Daten mit der Webapp zugreifen?

Ich will halt nicht die Daten mit der webapp als Teil des WAR deployen da es viele Daten sind.

Ein weiterer Punkt war dass die Initialisierung/Processing der Daten sehr lange dauert und nicht bei jedem deployen der webapp geschehen sollte. Alleine schon weil es den Entwicklungsprozess sehr verlangsamen wuerde. Deshalb wollte ich eine 2te Webapp schreiben die die Daten einmal einliest, prozessiert und welche dann nie mehr re-deployed wird und der 1sten Webapp die prozessierten Daten zur Verfuegung stellt. Die 1ste Webapp koennte also immer wieder redeployed werden ohne Re-prozessierung der Daten.


----------



## Noctarius (20. Dez 2009)

Ich denke das, wenn du soviele Daten hast, eine Datenbank tatsächlich das Beste wäre. Was hält dich davon ab eine Datenbank einzusetzen? Was stört dich an dem Gedanken?

Der beste Platz um Daten vorzuhalten ist nunmal eine Datenbank. Du wirst nahezu niemals schaffen eine schnellere Datenabfrage hinzubekommen als Datenbanken das können.


----------



## sirbender (20. Dez 2009)

Zunaechst einmal geht es wirklich nur darum ein paar Dateien einzulesen und daraus Java-Datenstrukturen zu machen. Ich glaube letztere Strukturen kann man auch nicht in einer Datenbank sinnvoll abspeichern. Nicht mal serialisieren geht.

Was mir uebrig bleiben wuerde waere also das Speichern der Rohdaten in der Datenbank. Das will ich natuerlich nicht.

Es ist also nicht moeglich von einem Servlet ausserhalb seines lokalen /webapp/servlet1 Verzeichnisses auf Daten zuzugreifen?

Btw, meintest du den HSQLDB Servlet mode: Chapter 1. Running and Using Hsqldb ? Oder den Embedded Mode?


----------



## Noctarius (20. Dez 2009)

Klar kannst du auf Verzeichnisse außerhalb des Webapp-Roots zugreifen. Wir sind hier ja nicht in so komischen Sprachen wie PHP wo man davon ausgeht, dass der Nutzer eines Scripts scheinbar keine Ahnung hat


----------



## sirbender (20. Dez 2009)

Hehe. Jaja...PHP 

Wie sollte ich das am besten machen? Ich wuerde ja eigentlich fast am liebsten per relativem Pfad zum webapps folder die Daten ablegen. Wie sollte der Zugriff auf eine solche Daten-Datei von einem Servlet aus erfolgen?


----------



## Noctarius (20. Dez 2009)

Ich würde ein Properties-File nutzen um darin den Pfad zu einer entsprechenden Datei konfigurierbar zu machen.


----------



## sirbender (20. Dez 2009)

nein ich meinte eher, welche Methode.

this.getServletContext().getRealPath() ? Oder welche Methode?

Wie gesagt wuerde ich ungerne einen absoluten Pfad nutzen. Also lieber ein Folder auf gleicher Hoehe wie das webapps-Verzeichnis von Tomcat.


----------



## Noctarius (20. Dez 2009)

Deswegen würde ich diesen absoluten Pfad in einer Propertiesdatei hinterlegen und so konfigurierbar machen. Dann brauchst du nicht mit relativen Pfaden zu experimentieren und bist viel flexibler.


----------

