Performance von Entity Bean create vs. JDBC insert

Status
Nicht offen für weitere Antworten.

ichbindiegute

Mitglied
Hallo!

Ich schreibe gerade an meiner Diplomarbeit zum Thema Reengineering einer Java Bibliothek und Portierung dieser in eine J2EE Umgebung mit EJB.

Ich benutze
Application Server: JBoss 4.0.2
Datenbank: ORACLE 10xe
EJB 2.0

Meine Frage bezieht sich auf Performance:
Es werden 160 Datensätze in eine Datenbanktabelle eingetragen. Die Programmlogik erzeugt ungefähr 400 JDBC insert Statements, die natürlich zu ungefähr 240 SQL Errors führen wegen DUPLICATE KEYS. Dies ist aber kein Problem.

In der neuen Version benutze ich Entity Beans, um genau dieselben Daten in die Datenbank einzutragen. Auch hier kommt es natürlich zu ungefähr 240 CreateExceptions.

Meine Frage: Wie kann es sein, dass die JDBC Aufrufe insgesamt etwa 150% MEHR Zeit beanspruchen, als die Entity Bean create Aufrufe? Wie kann der Application Server die Performance so stark erhöhen?

Ich bin dankbar für jeden Hinweis!

Viele Grüße,
Monika
 

semi

Top Contributor
ichbindiegute hat gesagt.:
Meine Frage: Wie kann es sein, dass die JDBC Aufrufe insgesamt etwa 150% MEHR Zeit beanspruchen, als die Entity Bean create Aufrufe? Wie kann der Application Server die Performance so stark erhöhen?
Statement-Cache. Die Insert-Statements werden gecached und immer wieder verwendet.

Es hängt auch davon ab, was du mit direktem JDBC machst. Ich würde sagen, JDBC sollte um einiges schneller
sein, da man hier nicht den ganzen Overhead des Application Servers hat.
 

ichbindiegute

Mitglied
Soweit ich das verstanden habe, kann man einen Prepared-Statement-Cache für JBoss in der oracle-ds.xml konfigurieren. Der entsprechende Tag lautet prepared-statement-cache-size und gibt die Anzahl der Prepared Statements an, die der Cache halten kann.

Allerdings habe ich diesen Tag gar nicht verwendet und (Zitat JBoss Server Handbuch) "ohne Angabe dieses Elements ist der Cache abgeschaltet".

semi hat gesagt.:
Ich würde sagen, JDBC sollte um einiges schneller
sein, da man hier nicht den ganzen Overhead des Application Servers hat.

Das würde ich auch sagen. Und trotzdem ist der Application Server dermaßen viel schneller.

Ich bin natürlich froh über die Performancesteigerung, dennoch würde ich gern etwas über die Gründe erfahren.

Irgendwelche weiteren Ideen?
 

bronks

Top Contributor
ichbindiegute hat gesagt.:
...
Das würde ich auch sagen. Und trotzdem ist der Application Server dermaßen viel schneller.

Ich bin natürlich froh über die Performancesteigerung, dennoch würde ich gern etwas über die Gründe erfahren.

Irgendwelche weiteren Ideen?
Das liegt daran, daß der AS die Entities cached. Es wird eine CreateException geschmissen, ohne erst in der DB den Key zu prüfen, da der AS dank caching bereits weiß, daß dieser bereits existiert.
 
G

Guest

Gast
Das liegt daran, daß der AS die Entities cached. Es wird eine CreateException geschmissen, ohne erst in der DB den Key zu prüfen, da der AS dank caching bereits weiß, daß dieser bereits existiert.

Diese Lösung fand ich prima. Vor allem habe ich in einem anderen Forum eine übereinstimmende Antwort bekommen:
Ich würde darauf tippen, das die Entity Beans sich bereits im Cache befinden. Dann weiß der JBoss das z.b. ein key bereits existiert ohne einen insert auf die Datenbank zu machen.
Aber ich kann durch die DEBUG Log Meldungen des AS sehen, dass er wirklich jedesmal ein INSERT Statement an die Datenbank schickt. :-(

Eine andere Lösung wäre, dass der Application Server nicht auf die Antwort der Datenbank wartet, sondern asynchron vorgeht. Aber das kann auch nicht sein, da er direkt nach dem INSERT Statement die CreateException wirft.

Weitere Vorschläge?
 

ichbindiegute

Mitglied
Das liegt daran, daß der AS die Entities cached. Es wird eine CreateException geschmissen, ohne erst in der DB den Key zu prüfen, da der AS dank caching bereits weiß, daß dieser bereits existiert.

Diese Lösung fand ich prima. Vor allem habe ich in einem anderen Forum eine übereinstimmende Antwort bekommen:
Ich würde darauf tippen, das die Entity Beans sich bereits im Cache befinden. Dann weiß der JBoss das z.b. ein key bereits existiert ohne einen insert auf die Datenbank zu machen.

Aber ich kann durch die DEBUG Log Meldungen des AS sehen, dass er wirklich jedesmal ein INSERT Statement an die Datenbank schickt. :-(

Eine andere Lösung wäre, dass der Application Server nicht auf die Antwort der Datenbank wartet, sondern asynchron vorgeht. Aber das kann auch nicht sein, da er direkt nach dem INSERT Statement die CreateException wirft.

Weitere Vorschläge?
 

bronks

Top Contributor
ichbindiegute hat gesagt.:
... Aber ich kann durch die DEBUG Log Meldungen des AS sehen, dass er wirklich jedesmal ein INSERT Statement an die Datenbank schickt. :-( ...
Da bin ich jetzt überrascht. Bitte wirf einen Blick in den Log der DB, um herauszufinden, ob der AS tatsächlich den Insert wegschickt.
 

ichbindiegute

Mitglied
Die CreateException wird von einer SQLException ausgelöst (der entity command no-select-before-insert arbeitet mit der Klasse SQLExceptionProcessor zusammen). Und diese SQLException kann sich der Application Server ja nicht einfach ausdenken. Deshalb gehe ich davon aus, dass die DB das INSERT bekommt ohne in die Logs der DB zu schauen.

Im ursprünglichen System ist auf jeden Fall das JDBC PreparedStatement mit dem INSERT der Bottleneck. Wahrscheinlich ist also nicht der AS unheimlich schnell, sondern das JDBC Statement im alten System unheimlich langsam. (?)
 

SnooP

Top Contributor
Kannst du ein langsames Verhalten auch feststellen, wenn du keine Constraints verletzt beim Inserten... sprich Einfügen von 200 Daten mit JDBC und mit ORM? Würde mich halt auch überraschen, wenn das jdbc langsamer sein sollte... man erkennt ja auch, welche Statements produziert werden.. wenn das die gleichen sind wie die aus dem jdbc-teil...nunja ;) - dann muss noch Magie dabei sein.

Werden denn die gleichen Tabellen benutzt oder nur ähnliche?
 

ichbindiegute

Mitglied
SnooP hat gesagt.:
Kannst du ein langsames Verhalten auch feststellen, wenn du keine Constraints verletzt beim Inserten... sprich Einfügen von 200 Daten mit JDBC und mit ORM? Würde mich halt auch überraschen, wenn das jdbc langsamer sein sollte... man erkennt ja auch, welche Statements produziert werden.. wenn das die gleichen sind wie die aus dem jdbc-teil...nunja ;) - dann muss noch Magie dabei sein.

Werden denn die gleichen Tabellen benutzt oder nur ähnliche?

Es sind haargenau die gleichen Daten, die in dieselbe Tabelle eingetragen werden. Ich habe jetzt in beiden Modulen (dem alten mit JDBC und dem neuen mit EJB) die Programmlogik geändert, um keine Duplicate Key Exception mehr zu haben. Und im alten Modul wird nicht mehr jedes INSERT einzeln commited sondern in einem batch insert alle Inserts zusammen.

UND: das neue Modul ist immer noch schneller. Es benötigt 54% der Laufzeit des alten Moduls.

Magie?!
 

Tellerrand

Bekanntes Mitglied
ichbindiegute hat gesagt.:
Es sind haargenau die gleichen Daten, die in dieselbe Tabelle eingetragen werden. Ich habe jetzt in beiden Modulen (dem alten mit JDBC und dem neuen mit EJB) die Programmlogik geändert, um keine Duplicate Key Exception mehr zu haben. Und im alten Modul wird nicht mehr jedes INSERT einzeln commited sondern in einem batch insert alle Inserts zusammen.

UND: das neue Modul ist immer noch schneller. Es benötigt 54% der Laufzeit des alten Moduls.

Magie?!
Der Unterschied liegt hier zwischen handoptimiertem Code und dem automatisch optimierten Code soviel ist klar. Wobei ich den handoptimeirten Code für nicht ganz optimal halte, es dürften noch einige Möglichkeiten existieren um diesen zu beschleunigen.
Da hilft nur sich direkt an der Datenbank an zu schauen was wie ankommt und weggeht.
Liegt dort kein Unterschied so existiert immernoch die Möglichkeit, dass die Verarbeitung z.B. String Operationen den handoptimeirten Code ausbremsen.
 

schalentier

Gesperrter Benutzer
Wie misst du die Geschwindigkeit im Application Server und im JDBC Programm?

Kann es sein, dass in der JDBC-Zeit die "Anlaufzeit" der VM mit drin ist? Je nach Umgebung ist diese nicht zu vernachlaessigen. Das ist die Zeit, die die Java VM selbst zum Laden braucht, bzw. die benoetigt wird, um genuegend Speicher anzufordern.

Wieviel Mal wiederholst du den Test, um zu messbaren und einigermassen konstanten Zeiten zu kommen? Sind die Zeiten konstant? Mit welcher Abweichung :)

Ich wuerd eher tippen, dass da ein Messfehler drin ist. Ich kann mir nicht vorstellen, dass es an Stringoperationen oder irgendwelchen Caches liegt. Dafuer sind 200 Datensaetze einfach zu wenig...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Performance Probleme wegen vieler Objekte Allgemeines EE 3
M Performance ApplicationBean vs. Datenbanksuche Allgemeines EE 4
J Performance von EJBs vs. normalen Pojos/Seam-Komponenten Allgemeines EE 4
E Performance-Problem beim ersten Request Allgemeines EE 4
P Suche free Webanwendung zu testen Last, Performance Allgemeines EE 3
T Design/Performance-Frage beim servlet (static oder nicht) Allgemeines EE 35
N JSF Performance - zu viele Methodenaufrufe, woher kommen sie Allgemeines EE 5
H Hibernate - OneToMany - mappedBy reference an unknown target entity property Allgemeines EE 1
T Anfängerfrage: h:selectOneMenu (JSF 2.0), @ManyToOne Annotation in Entity (JPA 2.0) Allgemeines EE 2
P detached entity passed to persist Allgemeines EE 5
H Bezug Entity<=>DB Allgemeines EE 5
I Entity wirft Nullpointer Allgemeines EE 2
J Datenbankmanipulation, methoden des Entity-Managers ? Allgemeines EE 3
F mappedBy reference an unknown target entity property Allgemeines EE 5
S EJB Entity Beans -> CMP Allgemeines EE 11
A Selbstreferenzierter Entity-Bean Allgemeines EE 3
S Löschen einer Entity kaskadiert nicht auf Collection (1:n) Allgemeines EE 2
G Entity Bean ignoriert Datenbank Allgemeines EE 16
G JBoss - Session / Entity Allgemeines EE 8
G Persistenz-Entscheidung (Entity Beans, Hibernate, JDBC) Allgemeines EE 12
M Session Bean vers. Entity Bean Allgemeines EE 3
M Entity Beans: Rückgabe von Collectionen an Client Allgemeines EE 2
R JSF Entitybean direkt in Sessionscoped Bean referenzieren Allgemeines EE 2
I Session löschen in Bean (Session Beans) Allgemeines EE 1
J Hello World mit Stateless Session Bean - Was mache ich falsch? Allgemeines EE 2
J Unterschied zwischen HttpSession und Stateful Session Bean Allgemeines EE 3
R Wie eine stateful session bean erneut "aufgreifen" Allgemeines EE 22
B [EJB] javax.inject.DefinitionException: bean not a Java type Allgemeines EE 5
T Einstieg in J2EE: Remote auf Bean zugreifen Allgemeines EE 11
H Bean läuft unter GlassFish, aber JBoss nicht Allgemeines EE 5
P Unterschied Session Scope / Stateful Session Bean Allgemeines EE 6
A Im PhaseListener auf Stateful Session Bean zugreifen Allgemeines EE 6
J geschützter Bean zugriff mit einem Rich-Client Allgemeines EE 2
2 JSTL Tags für eine Bean? Allgemeines EE 4
M Spring: Bean als Webservice freigeben Allgemeines EE 9
D Problem mit EJB: Bean soll Objekt eigener Klasse zurückgeben Allgemeines EE 2
V JSP BEAN Speichern von einer Zahl nach eingabe Allgemeines EE 2
H Bean Vergleich.gibts da schon was Feines? Allgemeines EE 13
B unterschied servlet und bean Allgemeines EE 2
F response.sendError() von Bean aus Allgemeines EE 6
A Session Bean mit Local-Interface nutzen Allgemeines EE 3
J prozesse aus der application-bean threadfähig? Allgemeines EE 4
G JSF dynamsiche style zuweisung aus Backing Bean Allgemeines EE 3
G Objekt von jsp an set Methode von Bean übergeben! Allgemeines EE 2
N Lokation von Bean Klassen? Allgemeines EE 5
M JSF Bean-Property mit Parameter aufrufen Allgemeines EE 12
M JSF & EJB "Bean not bound" Problem Allgemeines EE 4
R Zugriff auf Managed Bean aus einem Filter Allgemeines EE 2
boxi JSF von einem Bean auf ein anderes Bean zugreifen Allgemeines EE 3
J Bean in der init-Methode des Servlets instanzieren Allgemeines EE 9
Y JSF - einzelne Bean zerstören/ungültig machen Allgemeines EE 2
S In einer Bean-Methode an ndere Beans kommen Allgemeines EE 7
RaoulDuke EJB 3.0 - Exceptions aus Methoden einer Session Bean Allgemeines EE 2
V Bean-Daten in JSF-JSP finden Allgemeines EE 3
J In einem Bean zugriff auf ein SessionBean? Allgemeines EE 2
F Session Bean -> Daten aus dem Servlet holen Allgemeines EE 11
F Package beim Cookie-setzten über BEAN nicht gefunden Allgemeines EE 4
M STRUTS/Cannot retrieve definition for form bean null on acti Allgemeines EE 4
E Methoden einer Bean aufrufen? Allgemeines EE 4
P jsf SelectOneMenu: Bean als SelectItem Value Allgemeines EE 5
P Struts Form Bean vs. Session Variable Allgemeines EE 6
G Exception creating bean of class . (Struts) Allgemeines EE 8
T statische Methoden versus Application-Bean Allgemeines EE 2
N Duplicate Bean Name (Tomcate 5.X, JDK 1.5) Allgemeines EE 2
M Unterschied zwischen Servlet und Bean/EJB Allgemeines EE 2
flashfactor Logging in einem Session-Bean Allgemeines EE 2
N Einbindung einer Bean in eine JSP (Tomcat-Server 5.5.x) Allgemeines EE 2
H Sichtbarkeit von Bean-Modifikationen? Allgemeines EE 2
H JSP, Session und Java-Bean Allgemeines EE 4
R html-form mit bean:write Allgemeines EE 10
R Use bean in scriptlet in struts Allgemeines EE 4
N Deployen einer EJB3.0 Bean Allgemeines EE 4
U Enterprise Bean mit dynamischer Datenbankauswahl? Allgemeines EE 3
T Filesystemzugriff von einer Bean? Allgemeines EE 6
C Mail von einer Session Bean aus senden Allgemeines EE 2
C Message Driven Bean soll keine Nachrichten empfangen Allgemeines EE 4
A Begriffe MBean JMX-Bean? Allgemeines EE 2
K JAVA BEAN DB Connection Prob Allgemeines EE 5
B Kein definiertes Bean? --- JDeveloper Allgemeines EE 5
C JSP mit java Bean Allgemeines EE 22
T Bean übertragen von Servlet zu Servlet Allgemeines EE 9
T Variablen von Bean über Servlet setzen Allgemeines EE 5
S XML parsen in Bean Allgemeines EE 2
G Instanzvariablen mit Strings in Bean vergleichen... Allgemeines EE 3
S Struts: Problem mit <bean:message> - Tag Allgemeines EE 1
A Kommunikation zwischen Java Servlet und Bean Allgemeines EE 1

Ähnliche Java Themen

Neue Themen


Oben