Eingabe-Set: Tausende (> 10000) von CSV-Dateien, die jeweils> 50000 Einträge enthalten. Ausgabe: Speichern Sie diese Daten in mysql db.Was ist Best Practice, um mehr als 500 Datensätze in mysql in einer einzigen Transaktion zu speichern
Ansatz genommen: Lesen Sie jede Datei und speichern Sie die Daten in der Datenbank. Unten ist das Code-Snippet für dasselbe. Bitte schlagen Sie vor, ob dieser Ansatz in Ordnung ist oder nicht.
PreparedStatement pstmt2 = null;
try
{
pstmt1 = con.prepareStatement(sqlQuery);
result = pstmt1.executeUpdate();
con.setAutoCommit(false);
sqlQuery = "insert into "
+ tableName
+ " (x,y,z,a,b,c) values(?,?,?,?,?,?)";
pstmt2 = con.prepareStatement(sqlQuery);
Path file = Paths.get(filename);
lines = Files.lines(file, StandardCharsets.UTF_8);
final int batchsz = 5000;
for (String line : (Iterable<String>) lines::iterator) {
pstmt2.setString(1, "somevalue");
pstmt2.setString(2, "somevalue");
pstmt2.setString(3, "somevalue");
pstmt2.setString(4, "somevalue");
pstmt2.setString(5, "somevalue");
pstmt2.setString(6, "somevalue");
pstmt2.addBatch();
if (++linecnt % batchsz == 0) {
pstmt2.executeBatch();
}
}
int batchResult[] = pstmt2.executeBatch();
pstmt2.close();
con.commit();
} catch (BatchUpdateException e) {
log.error(Utility.dumpExceptionMessage(e));
} catch (IOException ioe) {
log.error(Utility.dumpExceptionMessage(ioe));
} catch (SQLException e) {
log.error(Utility.dumpExceptionMessage(e));
} finally {
lines.close();
try {
pstmt1.close();
pstmt2.close();
} catch (SQLException e) {
Utility.dumpExceptionMessage(e);
}
}
Ich würde versuchen, einen Massenexport zu dumpen oder zu importieren, um sie alle einzufügen. –
Sollen wir die Terminologie klären? In SQL World Dump bedeutet Daten, die aus einer Datenbank entweder als eine Reihe von SQL-Abfragen, CSV oder ein Besitzerformat exportiert wurde. Daten von einem Dump oder in eine Datenbank zu bekommen heißt Importieren oder Laden. Jetzt, wenn Sie Ihre Frage klären könnten ... – e4c5
Ich habe kürzlich ein ähnliches Problem behandelt, in meinem Fall sind die Daten 600.000+. Meine Lösung verwendet Multithread und blockierende Warteschlange, um die Daten zu importieren. Multithreading verbessert jedoch nicht die Leistung, es reduziert nur die Antwortzeit. Wenn Sie es wirklich schneller machen wollen, sollten Sie eine parallele Lösung in Erwägung ziehen. Aber 50.000 sind zu klein, um parallelisiert zu werden, die Komplexität überwiegt den Nutzen bei weitem. Daher schlage ich vor, dass Sie mit Single-Thread mit Bulk-Insertion bleiben. –