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.
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.
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 ....
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.
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.
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.
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.
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...
Was steht in this.URL? Es gibt (zumindest in PHP) einen Unterschied zwischen localhost und 127.0.0.1.
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.
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.
Ok, dann such ich mir jetzt mal ein Java Framework. Da sollte Connection Pooling enthalten sein, oder nicht? Gib's ne Empfehlung?
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.
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.