Я хотел вставить 200000 строк в таблицу через соединение JDBC mysql. В моей таблице три столбца DISTRICT1 (Id, Name, country). Я использовал multi-потоки для выполнения операции вставки, и он вставил данные менее чем за 1 минуту. Затем я снова попытался выполнить аналогичную операцию с таблицей DISTRICT2 (Id, Name, country), в данном случае это занимает очень очень долгое время (более 2 часов) для вставки строк (как это происходит с однопоточным). Единственное отличие между таблицами буксировки состоит в том, что в таблице DISTRICT2 есть поле Id , который связан с другими таблицами через отношение внешнего ключа , в то время как DISTRICT1 таблица не имеет такой связи. Также другое отличие состоит в движке mysql, DISTRICT1имеет ENGINE = MyISAM, в то время как ENGINE = INNODB для DISTRICT2 Также он дал java.lang.OutOfMemoryError
, когда я использовал PreparedStatement вместо Statement . Имеет ли он какое-то отношение к соединятьпул ионов ?
Пожалуйста, скажите почему это занимает так много времени , когда таблица имеет некоторое отношение? Я использовал один и тот же программный код, чтобы вставить обе таблицы. Я использовал следующий код, чтобы сделатьитак:
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();
}
класс MyRunnable4District показан ниже
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();
}
}
}
}