Schnellste Weg zum einfügen in MySQL in Java
Ich habe ein service-endpoint, die im Grunde fügt einige Daten in mysql. Ich bin auf der Suche nach der Schnellste Weg, um eine Zeile einfügen in die mysql.
Mir nichts aus, wenn es sehr ausführliche oder wenn es länger dauert, bis änderungen (im Vergleich zu sagen mit hibernate), wie der Umfang dieses servlet ist sehr minimal, aber die Leistung ist top-Priorität wirklich.
Ich bin newish zu java/servlets also bitte lassen Sie keine details aus oder übernehmen zu viel auf mein Ende.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Schnellste Weg ist wahrscheinlich, um mit einem JDBC-Treiber direkt und schreiben der SQL selbst.
Hier finden Sie einige Beispiel-code, der sieht gut auf mich: http://www.roseindia.net/jdbc/jdbc-mysql/InsertValues.shtml
Leute benutzen Ruhezustand für viele Gründe. Andere als die, die es viel einfacher, die map-Klassen auf Datenbank-Tabellen es kann auch mit caching, connection-pooling und so ein Zeug. Öffnen Sie eine neue Datenbank-Verbindung nimmt sich viel Zeit, so dass Sie implementieren müssen, um sowas selbst zu machen, Sie servlet gut.
Der Schnellste Weg ist über JDBC batch inserts:
http://www.roseindia.net/jdbc/Jdbc-batch-insert.shtml
Es ist-Vergleich der insert-Geschwindigkeiten unter Verwendung von JDBC und verschiedene Methoden. Es ist für PostgreSQL, aber der Ansatz und die Ergebnisse werden ähnlich wie bei MySQL: http://rostislav-matl.blogspot.com/2011/08/fast-inserts-to-postgresql-with-jdbc.html .
Kurz: verwendet batched inserts (unterstützt wahrscheinlich in jedem JDBC-Treiber) und, wo verfügbar, erwägen Sie KOPIEREN AUS.
Sicher sein, eine Verbindung zu verwenden pool oder etwas ähnliches. Dies ist mit Abstand der größte Faktor.
Könnte es auch helfen, eine
PrepraredStatement
tatsächlich bleibt in servlet Anfragen um Ersatz MySQL von der Analyse der Anforderung zu jeder Zeit.Beide zusammen umgesetzt werden könnten, indem Sie einfach halten die DB-Verbindung sowie die
PreparedStatement
imThreadLocal
, aber das setzt Voraus, dass der servlet-container verwendet einen thread-pool.Update: c3p0 anscheinend implementiert connection und statement pooling, also würde ich einfach die verwenden.
Wenn Sie nicht mit dem JPA, empfehle ich die Nutzung JdbcTemplate von Spring (auch wenn Sie nicht verwenden Feder anderweitig) zur Verwaltung der verbindungen (geschlossen etc.)
PreparedStatements Verwenden.
Nicht initialisiert den Treiber/Anschlüsse direkt. Lieber eine pooled DataSource konfiguriert in Ihre application-server (Sie können inject mit @Resource).
Verwendung von EJBs für Transaktions-management.
Wenn Sie nur das einfügen einer einzigen Zeile, ein einfaches, einfügen, evtl. vorbereitete Abfrage, ist wahrscheinlich am schnellsten. Verwenden Sie einen connection pool, so dass Sie nicht haben, zu verbinden jedes mal, und es gibt tuning-Parameter auf die Datenbank, die einen Unterschied machen wird.
Wenn Sie können mit ihm Weg erhalten, würde ich vorschlagen, nicht tatsächlich tun, die stecken in dem servlet, sondern nur darum, die Daten in ein Speicher-Warteschlange, in die Datenbank eingefügt, die von einem anderen thread. Sie wird nicht wissen, ob es erfolgreich war oder nicht in die servlet-Antwort, obwohl.
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html
http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html