Website MySQL Zugriff: Java langsammer als PHP?

OP #3229864
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.
Gast #3229973
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.
Gast #3230023
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.
#3230061
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.
Gast #3230131
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.
#3230374
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.
OP #3230599
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...
Gast #3230711
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.
#3230727
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.
#3230819
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.
Persönliche Seite #3230827
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...
#3230951
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.
#3235467
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.