Forum: PC-Programmierung Website MySQL Zugriff: Java langsammer als PHP?


von Be B. (bebo)


Lesenswert?

Hi,

ich teste gerade unterschiedliche Websprachen. Unter anderem auch 
PHP/Apache und Jave/Tomcat.

Ohne MySQL Zugriff ist das Java Servlet ca 3x schneller als PHP bei der 
Generierung einer dynamischen Seite.

Nun habe ich eine einfache Abfrage an MySQL eingebaut. Und kann es kaum 
glauben.

Mit PHP steigt die Ausführungszeit (gemessen mit Firebug) nur um 
ungefähr 1ms an.

Mit Java steigt die Ausführungszeit ca. 7 ms an und dauern damit fast 
genau so lange wie mi Ruby.

Kann das sein? nun sind es zwar verschiedene Installationen, aber ich 
kann mich nicht erinnern bei der Linux Installation von PHP irgendetwas 
getuned zu haben.

Verwende ich vielleicht den falschen Connector/J? Immerhin ist Java ja 
ohne mySQL connection schneller.

von Peter II (Gast)


Lesenswert?

Be Bo schrieb:
> Kann das sein?

wenn du schon vergleiche machst, warum schreibt du nicht einfach mal weg 
wo die zeit in Java vergeht?

Es kann durchaus sein, das bei Java die erste anfrage so lange dauert, 
die nachfolgenden aber schneller sein weil Java am Anfang erst die JDBC 
Sachen nachlädt, dafür dann aber die Datenbankverbindung im Gegensatz zu 
PHP offen halten kann für weiter anfragen.

PHP ist viel schneller beim Starten als Java - deswegen kann man noch 
lange nicht sagen das es in der Praxis eine rolle spielt.

von Heiko J. (heiko_j)


Lesenswert?

Aus dem Bauch heraus würde ich anhand der gemessenen Zeiten mal tippen, 
das du bei PHP Connectionpooling verwendest und bei deinem Javaschinken 
nicht.

Das ist natürlich nur geraten, aber ohne weitere Information ....

von Peter II (Gast)


Lesenswert?

Heiko Jakob schrieb:
> Aus dem Bauch heraus würde ich anhand der gemessenen Zeiten mal tippen,
> das du bei PHP Connectionpooling verwendest und bei deinem Javaschinken
> nicht.

hat denn PHP so etwas überhaupt. Es ist doch je nach Apache konfig jedes 
mal ein neuer Prozess.

von Heiko J. (heiko_j)


Lesenswert?

Peter II schrieb:
> Heiko Jakob schrieb:
>> Aus dem Bauch heraus würde ich anhand der gemessenen Zeiten mal tippen,
>> das du bei PHP Connectionpooling verwendest und bei deinem Javaschinken
>> nicht.
>
> hat denn PHP so etwas überhaupt. Es ist doch je nach Apache konfig jedes
> mal ein neuer Prozess.
Jops, PHP hat sowas. 
http://php.net/manual/en/mysqlnd-mux.connection_pool.php

AFAIK macht PHP nicht immer einen neuen Prozess auf sondern nutzt wie 
Java auch Multithreading wenn's mit den richtigen Optionen gebuilded 
wurde.

von Peter II (Gast)


Lesenswert?

Heiko Jakob schrieb:
> AFAIK macht PHP nicht immer einen neuen Prozess auf sondern nutzt wie
> Java auch Multithreading wenn's mit den richtigen Optionen gebuilded
> wurde.

Multithreading ist in php meines wissens noch Beta Status. Sollte 
Produktiv nicht eingesetzt werden.

der connectionpool ist Prozessbezogen, wenn man z.b. mit FastCGI mehre 
anfrage über einen Prozess schickt dann geht es. Leider hat man keine 
Kontrolle in welchen CGI-Prozess welche Anfrage landet.

steht auch so hier:

Depending on the deployment model, the pool is used for the duration of 
one or multiple web requests. Network connections are bound to the 
lifespan of an operating system level process. If the PHP process serves 
multiple web requests as it is the case for Fast-CGI or threaded web 
server deployments, then the pooled connections can be reused over 
multiple connections. Because multiplexing means sharing connections, it 
can even happen with a threaded deployment that two threads or two 
distinct web requests are linked to one pooled network connections.

von Heiko J. (heiko_j)


Lesenswert?

Peter II schrieb:
> der connectionpool ist Prozessbezogen,
Das ist er in Java und sonst überall auch :-) Schließlich ist jeder 
Prozess ein eigenes Programm mit eigenem Speicherraum, mit SHMEM könnte 
man da theoretisch drumrum basteln, aber jeder Datenbanktreiber wird 
schon das eine oder andere static und global haben um das in der Praxis 
unmöglich zu machen.

Sei's drumm. Connection pooling beim Applicationserver einschalten und 
5-6 Datenbankverbindungen von Anfang an als startwert offenhalten und 
gut isses.

von Be B. (bebo)


Lesenswert?

Ich sehe schon, einfach installieren und sich ein paar Programmzeilen im 
Internet zusammensuchen scheint nicht zum Ziel zu führen.

Das Java langsammer startet als PHP glaube ich nicht, denn lasse ich die 
mySQL Abfragen weg, ist Java die generierte Seite deutlich schneller 
zurück. Es muß also mit den mySQL Zugriffen zusammenhängen.

Ich habe libmysql-java installiert. Ich denke mal, daß das der richtige 
connector ist. Er funktionniert zumindest. Oder gibt's da verschiedene?

Der Code sieht dann ungefähr wie folgt aus:
1
   
2
try {
3
  Class.forName(this.Driver);
4
  this.connection = DriverManager.getConnection(this.URL, this.Username, this.Password);
5
} catch (Exception e) {
6
  e.printStackTrace();
7
  System.out.println("Error Connecting with User:" + Username + " and Password:" + Password);
8
}

Alleine wenn ich nur connecte, dauert das schon ca 3-4ms.

Nun muß ich mich in Java aber erst einarbeiten. Das letzte mal, daß ich 
Java benutzt habe liegt ungefähr 13 Jahre zurück.

Im Grunde habe ich dieses hier als Vorlage verwendet. 
(http://www.informatik-blog.com/2009/01/28/mysql-verbindung-aufbauen-query-senden-abfragen/)

> wenn du schon vergleiche machst, warum schreibt du nicht einfach mal weg
> wo die zeit in Java vergeht?
Wenn ich wüßte, wie man das macht...

von T.roll (Gast)


Lesenswert?

Was steht in this.URL?
Es gibt (zumindest in PHP) einen Unterschied zwischen localhost und 
127.0.0.1.

von Peter II (Gast)


Lesenswert?

Be Bo schrieb:
> Class.forName(this.Driver);

das alleine könnte schon viel zeit kosten. Keine Ahnung wo Java überall 
nach seinen Klassen sucht. Und wenn jetzt der Virenscanner jeden Datei 
vorher sich anschaut ist das einfach langsam.

wenn es eine echte Serveranwendung ( Java Servlets) und nicht nur eine 
JSP ist dann wird das aber nur einmal gemacht.

von Heiko J. (heiko_j)


Lesenswert?

Be Bo schrieb:
>   this.connection = DriverManager.getConnection(this.URL, this.Username,
> this.Password);
> } catch (Exception e) {
>   e.printStackTrace();
>   System.out.println("Error Connecting with User:" + Username + " and
> Password:" + Password);
> }


Muhahah .... Du weist schon das du damit jedes mal eine neue Verbindung 
aufmachst ? Da sind 3-4 ms gar nicht mal schlecht. Nimm connection 
pooling und hol dir beim start deines Programms 5-6 Verbindungen die 
danach einfach wiederverwendet werden und fertig ist die laube.

von Be B. (bebo)


Lesenswert?

Ok, dann such ich mir jetzt mal ein Java Framework. Da sollte Connection 
Pooling enthalten sein, oder nicht?

Gib's ne Empfehlung?

von Heiko J. (heiko_j)


Lesenswert?

Be Bo schrieb:
> Ok, dann such ich mir jetzt mal ein Java Framework. Da sollte Connection
> Pooling enthalten sein, oder nicht?
>
> Gib's ne Empfehlung?
Datenbank Connection pooling macht im Normalfall dein Applicationserver 
und nicht dein WebFramework.

Was Du brauchst ist ein Lösungsstack:

Für Kleinkram nehm ich immer den Tomcat als Applicationserver und das 
Struts  WebFramework. Wenn's komplexer wird und ich JPA brauche nehm ich 
gleich nen richtigen JEE-Stack auf Glassfish basis und für's frontend 
GWT.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Be Bo schrieb:
> ich teste gerade unterschiedliche Websprachen.
> Unter anderem auch PHP/Apache und Jave/Tomcat

... und hast nach dem 10.ten Thread immer noch nicht den Unterschied 
zwischen Programiersprache, Framework und Container verstanden...

Was soll eigentlich deine unermüdliche Suche nach der "schnellsten 
Websprache" bewirken?

Wie "schnell" ein Webanwendung ist hängt um mehrere Größenordnungen von 
der Implementierung und Architektur ab, die unterliegende Sprache ist 
nahezu bedeutungslos.

Be Bo schrieb:
> die Ausführungszeit (gemessen mit Firebug)

Das ist nicht die Ausführungszeit... sonder die Ladezeit, welche u.A. 
noch das Netzwerkdelay enthält welches später um ein vielfaches über dem 
Unterschied von (jetzt) 1ms vs. 7ms legen wird...

von Heiko J. (heiko_j)


Lesenswert?

Läubi .. schrieb:
> ... und hast nach dem 10.ten Thread immer noch nicht den Unterschied
> zwischen Programiersprache, Framework und Container verstanden...

Das kommt noch. Immerhin hat er es schon mal geschafft sich ne Webseite 
mit "google based engineering"(TM) zusammenzustupfen. Er ist also nur 
unerfahren und nicht dumm.

> Was soll eigentlich deine unermüdliche Suche nach der "schnellsten
> Websprache" bewirken?

Wer jung ist will halt immer schneller,weiter, höher ... der Weg ist das 
Ziel, dabei ist es erstmal egal wo das Ziel liegt :-) Er wird's schon 
noch lernen.

von Andreas B. (andreasb)


Lesenswert?

Peter II schrieb:
> Heiko Jakob schrieb:
>> AFAIK macht PHP nicht immer einen neuen Prozess auf sondern nutzt wie
>> Java auch Multithreading wenn's mit den richtigen Optionen gebuilded
>> wurde.
>
> Multithreading ist in php meines wissens noch Beta Status. Sollte
> Produktiv nicht eingesetzt werden.

Vorsicht, PHP gibt es schon seit Jahren in einer "MT" Version, welche im 
Apache Modul Multithreaded läuft, also ein PHP Skript pro Thread.

Da ist auch Pooling möglich. Mehrere Threads in einem PHP Skript ist 
meines Wissens nicht möglich. (bzw. experimentell)



mfg Andreas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.