hat ich Zeilen in eine Tabelle über JDBC mysql connection.My Tabelle einfügen wollte hat drei Spalten DISTRICT1 (Id , Name, Land) .Ich verwendete Multithreads, um den Vorgang auszuführen, und es fügte Daten in weniger als 1 Minuten ein.Dann wiederum versuchte ich, ähnliche Operation auf DISTRICT2 (ID, Name, Land) Tabelle durchzuführen In diesem Fall dauert es sehr sehr lange Zeit (mehr als 2 Stunden), um Zeilen einzufügen (genau wie es mit single thread tut). Der einzige Unterschied zwischen den Tow-Tabellen ist, dass DISTRICT2 Tabelle hat ein Feld Id, die zu anderen Tabellen durch Fremdschlüssel-Beziehung verknüpft ist während DISTRICT1 Tabelle keine solche Beziehung hat. Auch der andere Unterschied von MySQL-Engine ist, hat DISTRICT1 ENGINE = MyISAM, während es ENGINE = BDB für DISTRICT2 Ebenfalls gab es java.lang.OutOfMemoryError
wenn ich PreparedStatement statt Statement .Does verwendet hat eine Beziehung mit Verbindungspooling?warum zu lange Zeit zu nehmen, Zeilen in einer MySQL-Tabelle einfügen auch nach Multithreading verwenden, wenn Tabelle eine Beziehung
Bitte sagen Sie warum es so lange dauert, wenn die Tabelle eine Beziehung habe ich denselben Programmcode verwendet einzufügen sowohl die tables.I verwendet folgenden Code, dies zu tun:
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 1; i <200001; i=i+10000) {
Runnable worker = new MyRunnable4District(i);
executor.execute(worker);
}
executor.shutdown();
}
die Klasse MyRunnable4District wird angezeigt unter
public class MyRunnable4District implements Runnable {
public int size;
public MyRunnable4District(int n) {
this.size = n;
}
public void run() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost/project",
"root", "root");
String[] countries = { "ARGENTINA", "US", "UK", "INDIA", "UKRAINE",
"CHINA" };
for (int id = size; id < size + 10001; id++) {
int districtId = id;
String districtName ="columbia"+id;
String districtCountry = countries[id % 6];
String query="INSERT INTO district "+"VALUES ("+districtId+",'"+districtName+"','"+districtCountry+"')";
//PreparedStatement stmnt =con.prepareStatement(query);
Statement stmnt =con.createStatement();
stmnt.executeUpdate(query);
}
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
con.close();
System.out.println("thread number with size "+size+" completed");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
hi Mark, Wenn schließende Anweisungen das Problem ist, dann warum es gut mit Tabelle district2 ausgeführt, die keine Fremdschlüsselbeziehung hat. In diesem Fall führte es in weniger als 2min etwa 2 Millionen Zeilen erfolgreich. – nikhil
@ user575854: Führen Sie den Client und den Server auf verschiedenen Computern aus? –
@mark, nein ich m es auf meinem lokalen Rechner.Ich denke, das Problem ist wegen INNODB-Engine in anderen Tabelle verwendet.Klicken Sie mir die Lösung dieses Problems – nikhil