Verwendung von MySQL -Lastdaten
In Datenbanken besteht die häufigste Möglichkeit zum Schreiben von Daten darin, über SQL Insert zu schreiben und zusätzlich die Datenbank über Sicherungsdateien wiederherzustellen. Diese Sicherungsdatei ist ein SQL -Skript in MySQL, wird jedoch tatsächlich in Stapeleinfügungsanweisungen ausgeführt.
In der Praxis treten häufig zwei Arten von Problemen auf: Einer ist der Datenimport, wie z. B. Daten aus Word, Excel-Tabelle oder TXT-Dokumenten (diese Daten stammen im Allgemeinen aus Dokumenten, die von nicht-technischen Mitarbeitern über Office-Tools eingegeben wurden). Der andere ist der Datenaustausch wie den Datenaustausch zwischen MySQL-, Oracle- und DB2 -Datenbanken.
Dies steht vor einem Problem: Es gibt Unterschiede in den Datenbank -SQL -Skripten, und SQL Exchange ist problematischer. Fast alle Datenbanken unterstützen jedoch den Export (Export) des Textdatenimports (Last). Mit diesem Fall können wir die oben genannten Datenaustausch- und Importprobleme lösen.
Die Ladedaten -Datei -Anweisung von MySQL wird verwendet, um Zeilen aus einer Textdatei mit hoher Geschwindigkeit zu lesen und in eine Tabelle zu laden. Der Dateiname muss eine wörtliche Zeichenfolge sein. Das Folgende ist eine Beispielbeschreibung von MySQL5, in dem zeigt, wie der Befehl mySQL verwendet wird, um den Textdatenimport zu implementieren.
HINWEIS: Der hier erwähnte Text ist Text mit einem bestimmten Format, z. B. Textästen, jede Zeile wird durch das gleiche Symbol usw. getrennt. Es gibt also viele Möglichkeiten, einen solchen Text zu erhalten, z. B. das Speichern von Wort und Excel -Tabellen in Text oder eine CSV -Datei.
Im Projekt besteht die verwendete Umgebung darin, eine CSV -Datei schnell hochzuladen. Das ursprüngliche System verwendete die DB2 -Datenbank, und dann wird eine Funktion ähnlich wie bei LOADDATA von MySQL bezeichnet. LoadData kann jedoch nicht in den gespeicherten Verfahren von MySQL verwendet werden. Diese Methode wird im Java -Code aufgerufen, wenn die Methode aufgenommen wird.
Implementierungsbeispiel:
Bereiten Sie das Testformular vor
SQL ist wie folgt:
USE test;CREATE TABLE `test` (`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,`a` int(11) NOT NULL,`b` bigint(20) UNSIGNED NOT NULL,`c` bigint(20) UNSIGNED NOT NULL,`d` int(10) UNSIGNED NOT NULL,`e` int(10) UNSIGNED NOT NULL,`f` int(10) UNSIGNED NOT NULL, Primärschlüssel (`id`), Schlüssel` a_b` (`a`,` b`)) motor = innoDB auto_increment = 1 charset = utf8
Der Java -Code lautet wie folgt:
Paket com.seven.dbtools.dbtools; import org.apache.log4j.logger; import org.springFramework.jdbc.core.jdbctemplate; import Java.io.Bytearrayinputstream; Import Java.inputstream; java.sql.sqlexception; import javax.sql.dataSource;/** * @author sieben * @Since 07.03.2013 */public class BulkloadData2mysql {private static Final Logger logger private jdbctemplate jdbctemplate; private Verbindung conn = null; public void setDataSource (DataSource -DataSource) {this.jdbctemplate = new Jdbctemplate (DataSource); } public static InputStream GetTestDatainputStream () {StringBuilder Builder = new StringBuilder (); für (int i = 1; i <= 10; i ++) {für (int j = 0; j <= 10000; j ++) {builder.Append (4); Builder.Append ("/t"); Builder.Append (4 + 1); Builder.Append ("/t"); Builder.Append (4 + 2); Builder.Append ("/t"); Builder.Append (4 + 3); Builder.Append ("/t"); Builder.Append (4 + 4); Builder.Append ("/t"); Builder.Append (4 + 5); Builder.Append ("/n"); }} byte [] bytes = builder.toString (). getBytes (); InputStream ist = neuer BytearrayInputStream (Bytes); Rückkehr ist; } / ** * * laden Bulk -Daten von InputStream zu MySQL * / public int bulkloadFrominPutStream (String loadDataSQL, InputStream DataStream) löscht sqlexception {if (DataStream == null) {logger.info ("InputStream, ohne dass Daten importiert wird"). Rückkehr 0; } conn = jdbctemplate.getDataSource (). getConnection (); PreparedStatement Anweisung = conn.Preparestatement (loadDatasql); int result = 0; if (Erklärung mysqlstatement.setLocalinFileInputStream (DataStream); result = mysqlstatement.executeUpdate (); } Rückgabeergebnis; } public static void main (String [] args) {String testsql = "Lastdaten lokaler Infile 'sql.csv' Ignorieren Sie in Tabelle test.test (a, b, c, d, e, f)"; InputStream DataStream = GetTestDatainputStream (); BulkloadData2mysql dao = new BulkloadData2mysql (); try {long grintime = system.currentTimemillis (); int rows = dao.bulkloadfrominputStream (testsql, datastream); Long EndTime = System.currentTimemillis (); logger.info ("importieren" + Zeilen + "Zeilen Daten in MySQL und Cost" + (Endime - Begintime) + "MS!"); } catch (sqlexception e) {e.printstacktrace (); } System.exit (1); }}Hinweis:
Der Code im Beispiel verwendet die SetLocalInFileInputStream -Methode, die den Dateinamen direkt ignoriert und den IO -Stream in die Datenbank importiert. In der tatsächlichen Implementierung können Sie die Datei auch auf den Server hochladen, dann die Datei lesen und dann die Datei importieren. Zu diesem Zeitpunkt sollte der lokale Parameter der Lastdaten entfernt werden und der Dateiname der Name des vollständigen Absolutpfads sein.
Schließlich wird die Infile -Syntax für die Datenlast angehängt
Daten laden [low_priority | Concurrent] [Local] Infile 'Datei_name.txt' [Ersetzen | Ignorieren] in Tabelle TBL_NAME [Fields [beendet von 'String'] [[optional] beigefügt von 'char'] [von 'char'] [Zeilen [beginnend mit 'String'] [von 'String']] [Ignore -Zeilen ignorieren] [(col_name_or_user_var, ...)] [set col_name = expr,]
Zusammenfassen
Loaddata ist ein sehr nützlicher Befehl. Es ist schneller, Daten aus einer Datei zu importieren als eine Einfütungserklärung. Die MySQL -Dokumentation besagt, dass sie ungefähr 20 -mal schneller ist. Es gibt jedoch viele Optionen für Befehle, aber die meisten können nicht verwendet werden. Wenn Sie es wirklich brauchen, lesen Sie einfach die offizielle Dokumentation, wenn Sie sie verwenden.