Objekte aus EJB an Client schicken

cew777

Mitglied
Hallo NG,

ich habe eine Java-Client-Applikation, die ein Stateful Session Bean benutzt und von diesem eine Methode aufruft, die ein Objekt zurückliefert.

Ich rufe nun die EJB-Methode in einer Schleife viele 10.000 Mal auf. Ich gebe alle 1000 Schleifendurchläufe eine Meldung aus. Dabei ist festzustellen, dass das Abholen für 1000 Objekte immer länger dauert, je länger das Programm läuft.
Auf dem Server wurden auch Meldungen ausgegeben. Die Verarbeitung im Bean beansprucht eine konstante Zeit.
Die Objekte werden (natürlich) per Serialisierung vom Server auf den Client übertragen.
Ich habe daher mittlerweile die Deserialisierung im Client in Verdacht. Aber wieso steigt deren Zeitbedarf an?

Um die Verwirrung (noch) größer zu machen: Das o.a.Phänomen ist zu beobachten unter Linux(64bit) mit JavaRE 1.6.0.27.
Führt man das gleiche Client-Programm auf Windows(32 bit) mit JavaRE 1.6.0.14 aus, ist die Verlangsamung nicht zu beobachten - die Objekte werden in konstant bleibender Zeit ausgelesen!

Kann mir jemand helfen? Ich weiss nicht ob ich hier im richtige Forum bin - denn ich bin mir nicht sicher ob es überhaupt an dem JavaEE-Aufruf liegt oder ob wir es mit einem Bug aus Java SE zu tun haben, der die (De)serialiserung betriftt!?

Danke für Eure Hinweise und Ideen!

Beste Grüße

C.Ed
 
Tja, da musst du wohl mal mit einem Profiler ran, wenn du wirklich wissen möchtest was da passiert. Zumindest mal ordentliches Logging.

Wo geht die Zeit verloren? Evtl. GC von vielen Objekten? Auf dem Server? Auf dem Client? Was ist das für ein AS und über welches Protokoll wird dort EJB Kommunikation realisiert? ... das geht noch lange so weiter...
 
Danke schon mal für die Antwort!

Ich habe jetzt mein Logging noch erweitert. In der Klasse deren Objekte übertragen werden, hab ich die Methoden readObject und writeObject überschrieben und darin die Zeit gemessen, die zum Serialisieren/Deserialisieren benötigt wird.

Das Serialisieren auf dem Server läuft konstant in durchschnittlich < 1 ms. Das Deserialisieren auf dem Client braucht mit fortlaufender Laufzeit des Client allerdings immer länger!

Ich hab mir nun auch mal die JConsole auf dem Client angeschaut - da sieht alles normal aus - also keine auffällig hohe Zahl oder lang andauernde GCs.

Mein Application Server ist ein JBoss6.0.
Als nächstes werde ich allerdings mal Objekte von der Platte deserialisieren und den Zugriff auf den JBoss ausklammern um zu schauen ob das Problem dann auch noch besteht.

Wie gesagt, unter Windows32 mit einer alten JRE (1.6.0.14) besteht das Problem nicht - nur unter Linux64 mit JRE 1.6.0.27!
:bahnhof:
 
Probier auf Windows doch lieber erstmal die gleiche JRE, wie auf Linux. Ab 1.6.0_26 wurden so viele Sachen verschlimmbessert, daß es evtl. daran liegt.

Hab ich jetzt gemacht. Keine Änderung: Unter Windows werden die Daten in konstanter Zeit gelesen.
Kann es einen Unterschied machen, dass auf Linux mit der 64bit-Version gearbeitet wird??
 
Es kann auch nur der Unterschied Linux vs. Windows sein. Ich habe in dem Zusammenhang schon die blödsinnigsten Sachen gesehen und deshalb würde mich das auch nicht mehr wundern.

Du hast recht..

Wir haben jetzt auch die 32bit-JRE-Version auf Linux getestet und dort ist das Problem zwar auch da, aber schon viel besser - weil die Verzögerung kleiner - als bei der 64bit-Version.
Es ist aber immernoch nicht so gut wie unter 32bit-Windows. Naja, muss man wahrscheinlich so hinnehmen.

Danke für Eure Antworten! :toll:
 

Zurück
Oben