# EJB Entity Beans -> CMP



## Saladin (21. Mai 2007)

Da ich noch ein Blutiger Anfänger in JAVA (komme aus der C Welt) bin, hoffe ich das ihr mir die ein oder andere Frage verzeit und mich hier auf den richtigen weg bringt. 

Es geht darum, das ich die Aufgabe habe einen Teil einer Session Bean in ein Entity Bean auszulagern (Weblogic Application Server). Der auszulagernde Teil liest sehr viele Daten aus einer Datenbank (bei jeder Session?!) und zieht die Performance so in den Keller. Hier kann man wohl ein Entity Bean ansetzen, um die Datenbankabfragen über einen Timer in größeren Abständen zu machen. 
Aber trotz ausgiebigem lesen sind da einige Sachen, die mir unklar sind.

a) Eignet sich ein Entity Bean?
b) Was past besser ein CMP oder BMP? (Ich dachte ein CMP passt schon)
c) Brauche ich für das Entity Bean eine DB, um die Session Daten abzulegen (besonders unklar).
d) Ein simples Entity Beispiel, das ohne weiteres auf einem Bea Weblogic 8.1 laufen soll
e) Gute Tutorials in Deutsch


Gruß
Saladin


----------



## schalentier (21. Mai 2007)

Ich vermute mal wild in der Gegend rum, da du mit Infos doch ziemlich sparsam umgehst ;-)

Die SessionBean bildet serverseitig eine Session ab (...^^). D.h. wenn jemand daherkommt und eine Session eroeffnet (Nutzer meldet sich an oder so), werden fuer den Nutzer spezifische Daten geladen und in der Session abgelegt. Demnach handelt es sich um eine Stateful SessionBean. Hoffe ich mal ;-)

Jetzt sollen diese Nutzerspezifischen Daten in einer EntityBean abgelegt werden. Da stellt sich ja gleich mal die Frage, wie das genau ablaufen soll. Ueber Timer? Hmm... waere moeglich, eleganter waere es sicherlich, wenn die EB direkt bei relevanten Aenderung aktualisiert wird. Aber das haengt zusehr von der Anwendung ab.

a) geht so ^^
b) kommt auf die Daten drauf an. Wenn die alle in einer Tabelle liegen (eine EB-Instanz pro Zeile) ist CMP am besten, wenns komplexer wird, isses mgl.weise einfacher, das Datenholen selbst mit BMP zu regeln.
c) Was meinst du mit Sessiondaten? Die Daten, die das EB liefern soll? Ein EB braucht nicht zwingend eine Datenbank, wenn du Daten z.B. berechnet werden. Dann musst du aber sicherlich BMP nehmen und beim Erzeugen des EB die Daten manuell fuellen (und das braucht keine DB).

Rest lass ich mal offen, google hilft bei sowas.

mfg


----------



## Saladin (21. Mai 2007)

Wenn ich mal dein Beispiel aufgreife, dann würde die aus der Datenbank gelesenen Daten alle User betreffen z.B. eine Blacklist die bei jeder Registrierung/Anmeldung gültig wäre und nicht ständig erneut aus der Datenbank ausgelesen werden müßte. Hierzu reicht ein Timer um in definierten Abständen die Datenbank erneut auszulesen.

-> Es handelt sich wie du richtig vermutet hast um eine Statefull SessionBean

Was die Session Daten angeht, habe ich folgendes in einem Tutorial gelesen:



> Die Hauptaufgabe der Entity Beans als 'Persistence Components' ist die Persistenz, also das dauerhafte Speichern über mehrere Sitzungen hinweg (meistens in relationalen Datenbanken).
> Entity Beans repräsentieren oft ein Objekt aus der realen Welt (in objektorientierter Darstellung).
> Die Daten einer Entity Bean entsprechen einer Zeile einer Datenbanktabelle (oder mehrerer Tabellen). Normalerweise können auch nur Operationen an genau einem Datensatz (also einer Tabellenzeile) durchgeführt werden (anders als bei SQL, wo über eine 'where'-Bedingung viele Tabellenzeilen auf einmal manipuliert werden können).
> Anders als eine Session Bean kann eine Entity Bean mehrere Clients gleichzeitig bedienen (dabei sind Clients in der Regel Session Beans).
> ...



Nun weiss ich nichts damit anzufangen. Für mich klingt das so, als ob der Applicationserver die Entity Beans (CMP) in der Datenbank ablegt bis zum nächsten Aufruf.


----------



## schalentier (21. Mai 2007)

Saladin hat gesagt.:
			
		

> Nun weiss ich nichts damit anzufangen. Für mich klingt das so, als ob der Applicationserver die Entity Beans (CMP) in der Datenbank ablegt bis zum nächsten Aufruf.



Eine EntityBean ist einfach ein Objekt im OO-Sinne, mit dem tollen Effekt, dass sich der Applicationserver um den Lebenszyklus kuemmern. D.h. ist z.b. der Speicher im Server voll, wird die EB aus dem Speicher gehauen und abgespeichert (irgendwo). Bei einem Zugriff auf eine EB, die nicht mehr im Speicher ist, wird diese zunaechst geladen, usw.

Wie das Speichern/Laden ablaeuft, haengt nun von deiner EB Implementierung ab. Eine CMP-EB wird in einer DB abgespeichert, mit dem Nebeneffekt, dass man sich als Entwickler darum ueberhaupt nicht zu kuemmern braucht. Man sagt nur, welche Eigenschaft des EB in welcher Spalte welcher Tabelle abgelegt wird.

Willst du das nicht, weil die Daten z.b. berechnet werden oder sonstwas, dann kommt eine BMP-EB in Frage. Hier musst du implementieren, was beim Speichern/Laden passieren soll. 

Achso, und verwirr mal nicht so mit deinem Begriff "Sessiondaten". Sessiondaten sind Daten, die fuer eine Session relevant sind (und nur fuer diese) und werden mit SessionBeans abgebildet. Du meinst aber Daten, die nichts mit einer Session zu tun haben, sondern die fest sind ueber alle Sessions und per Timer aktualisiert werden.


----------



## Saladin (21. Mai 2007)

Bin wie gesagt 





> ...Blutiger Anfänger...


 in Java daher SORRY wenn ich den einen oder anderen Begriff in einem falschen Zusammenhang verwende, ist keine Böswilligkeit.


In unserem Beispiel enthält das EB(BMP) ein Object das die DB öffnet und mit einer SQL Anweisung nach einem Schwarzen Schaf sucht und einfach einen Boolschen Wert zurück liefert bei einem Treffer. Wie sähe hier das Speichern/Laden aus? Ich will keinen fertigen Code von dir, ich kann mir nur leider noch nicht vorstellen, wie das ganze aussehen soll. Auf was muss ich achten. 
Wie bringe ich WebLogic bei wie und wo er in solch einem Fall das EB ablegen soll?
Wenn Speichermangel der Grund für die Auslagerung/Speicherung des EB wäre es vieleicht auch besser, das EB zu löschen, um beim nächsten Zugriff halt neues zu erzeugen.

Gruß
Saladin


----------



## bronks (22. Mai 2007)

Saladin hat gesagt.:
			
		

> ... Wie sähe hier das Speichern/Laden aus? Ich will keinen fertigen Code von dir, ich kann mir nur leider noch nicht vorstellen, wie das ganze aussehen soll. Auf was muss ich achten.
> Wie bringe ich WebLogic bei wie und wo er in solch einem Fall das EB ablegen soll?
> Wenn Speichermangel der Grund für die Auslagerung/Speicherung des EB wäre es vieleicht auch besser, das EB zu löschen, um beim nächsten Zugriff halt neues zu erzeugen ...


Da muß man garnichts machen, denn das läuft alles automatisch und das ist m.E. das, was das verwirrendste für einen EE-Anfänger ist.

Gute Tuts: www.laliluna.de

Sind zwar zum Großteil für JBoss, funktionieren nach ein paar Denkminuten auf Weblogic ebenfalls.


----------



## Saladin (22. Mai 2007)

Hmmm Automatisch sagst du? :bahnhof: 
Aber warum liest sich in jedem Tutorial das ganze so, als ob man bei einer bmp EB sich selber darum kümmern muss.

Hat den keiner ein kleines Beispiel für mich, wie das ganze umgesetzt werden könnte. :roll: 

Die von dir genannte Seite ist leider ein Bezahl Service!:bloed: 


Gruß
Saladin   :


----------



## Guest (22. Mai 2007)

Egal ob BMP oder CMP, der Zugriff auf die Datenbank bleibt dir nicht erspart. Selbst wenn die Entity-Beans 
gecached werden, laufen Suchabfragen (finder-Methoden) über die Datenbank. Die einfachste Lösung ist 
wirklich eine simple JDBC-Query, die prüft, ob ein gegebener User gesprerrt ist oder nicht. Das sind paar 
Millisekunden, die eine solche Abfrage dauert.
Meiner Meinung nach, ist dies kein Thema für Entity Beans, wenn sie nur dazu benutzt werden sollen.


----------



## Guest (22. Mai 2007)

Solltest du es trotzdem mal durchziehen wollen, dann findest du hier Beispiele 
zu Weblogic 8.1 ( http://e-docs.bea.com/wls/docs81/ejb/index.html ) bzw. hier 
rechts auf der Seite http://dev2dev.bea.com/ejb/


----------



## Saladin (23. Mai 2007)

Na ja nach langer Recherche sind mir nun einige Sachen klarer:
Hier ein kurzes Resümee:


Ob man BMP oder CMP verwenden möchte, hängt davon ab, ob man die vorhandenen Daten (_Klassen, Membervariablen, etc_) im 
EB automatisch oder manuell in einer Datenbank abspeichern lassen möchte. 
Die Datenbankverbindung wird vom Application Sever aufgebaut und verwaltet.
Möchte man z.B. eine Membervariable x einer CMP automatisch abspeichern lassen (abspeichern da das 
EJB Persistent ist und immer wieder vom Application Server(*AS*) verwendet wird), gibt man
 im Deployment Descriptor (_ejb-jar.xml_) die Anweisung an den Application Server über einen Tag 
	
	
	
	





```
<cmp-field><field-name>x</field-name></cmp-field>
```
Sollte nun das EJB nicht verwendet werden, legt der *AS* die gewünschten Daten in der 
Datenbank ab (was passiert mit den restlichen Daten (_Klassen, Membervariablen, etc_) die 
nicht explizit erwähnt sind ??)

Ein BMP EB unterstützt diese Automatische Containerverwaltung nicht. Wenn man seine Daten (_Klassen, Membervariablen, etc_) von einem Aufruf zum nächsten Sichern möchte, oder die daten vor dem ablegen noch 
ändern möchte, muss das Manuell passieren, was eine höhere Fehleranfälligkeit hat.

Ich hoffe das das soweit richtig ist.

*Habe aber daher noch zwei Fragen*: 
a) Was passiert bei einem BMP EB, wenn man die Daten nicht manuell absichert (was passiert mit diesen?). Nach obigem Beispiel, wenn man ein Objekt im Constructor instanziert und damit arbeitet, ohne die oben erwähnten Sicherungsmassnahmen zu tätigen.

b) Kann man in CMPs auch Objekte zum Sichern in einer Datenbank angeben?


Gruß
Saladin


----------



## bronks (23. Mai 2007)

Saladin hat gesagt.:
			
		

> Hmmm Automatisch sagst du? :bahnhof:
> Aber warum liest sich in jedem Tutorial das ganze so, als ob man bei einer bmp EB sich selber darum kümmern muss.


Getter und Setter werden sowieso generiert. Das einzige wo man ein bissl was extra reinschreiben muss ist ejbCreate(), ejbLoad(), ejbStore() und ejbRemove(). Finder machen so oder so Arbeit. Speichern, Laden, Caching und Transaktionen sind automatisch.



			
				Saladin hat gesagt.:
			
		

> ... Die von dir genannte Seite ist leider ein Bezahl Service!:bloed: ...


Weiß nicht warum der Daumen nach unten zeigt, denn so eine Dichte an *kostenlosen*, ausführlichen und funktionierenden Tuts findest Du kaum wo anders.


----------



## Guest (23. Mai 2007)

Saladin hat gesagt.:
			
		

> Ich hoffe das das soweit richtig ist.


Fast.  Sowohl bei BMP, wie auch bei CMP werden die Entities automatisch gespeichert, wenn die Transaktion 
beendet wird. Unterschied besteht darin, dass du bei BMP selbst dafür sorgen muss, dass diese auch erstellt/
gespeichert/geladen (ejbCreate, ejbLoad, ejbStore) werden.
Die Unterschiede im Deployment-Descriptor sind auch umfassender als nur die CMP-Field Angaben. Es sind 
sehr viele Sachen, die berücksichtigt werden müssen, so dass es schwierig ist, das ganze hier in einem Thread 
zu beschreiben. Da gibt es 1000 Seiten lange Bücher, die sich damit beschäftigen. 
Ein richtig gutes ist das hier: http://www.theserverside.com/tt/books/wiley/masteringEJB/index.tss

Ein grosse Hilfe bei dem ganzen EJB Zeugs sind Ant und XDoclet. Damit kann man zumindest die Erstellung
von Deployment-Descriptoren, das Packaging und Deployment automatisieren.



			
				Saladin hat gesagt.:
			
		

> *Habe aber daher noch zwei Fragen*:
> a) Was passiert bei einem BMP EB, wenn man die Daten nicht manuell absichert (was passiert mit diesen?). Nach obigem Beispiel, wenn man ein Objekt im Constructor instanziert und damit arbeitet, ohne die oben erwähnten Sicherungsmassnahmen zu tätigen.


Dann passieren merkwürdige Sachen auf dem Server. 
Implementierst du die Store-Methode nicht, wird auch nichts gespeichert.


			
				Saladin hat gesagt.:
			
		

> b) Kann man in CMPs auch Objekte zum Sichern in einer Datenbank angeben?


Ja, diese werden dann als BLOB serialisiert, wenn sie java.io.Serializable implementieren. Ist dies nicht der Fall, dann knallt's.


----------

