ich geschrieben habe, ein Verfahren insert()
, in dem ich versuche, JDBC Batch zu verwenden, um das Einfügen eine halbe Million Datensätze in einer MySQL-Datenbank:JDBC Batch Insert OutOfMemoryError
public void insert(int nameListId, String[] names) {
String sql = "INSERT INTO name_list_subscribers (name_list_id, name, date_added)"+
" VALUES (?, ?, NOW())";
Connection conn = null;
PreparedStatement ps = null;
try{
conn = getConnection();
ps = conn.prepareStatement(sql);
for(String s : names){
ps.setInt(1, nameListId);
ps.setString(2, s);
ps.addBatch();
}
ps.executeBatch();
}catch(SQLException e){
throw new RuntimeException(e);
}finally{
closeDbResources(ps, null, conn);
}
}
Aber wenn ich versuche, diese Methode zu laufen, ich erhalten folgende Fehlermeldung:
java.lang.OutOfMemoryError: Java heap space
com.mysql.jdbc.ServerPreparedStatement$BatchedBindValues.<init>(ServerPreparedStatement.java:72)
com.mysql.jdbc.ServerPreparedStatement.addBatch(ServerPreparedStatement.java:330)
org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:171)
Wenn ich ps.addBatch()
mit ps.executeUpdate()
ersetzen und entfernen ps.executeBatch()
, es funktioniert gut, obwohl es einige Zeit dauert. Bitte lassen Sie es mich wissen, wenn Sie wissen, ob die Verwendung von Batch in dieser Situation angemessen ist, und wenn ja, warum gibt es OurOfMemoryError
?
Dank
und was sollte der Wert von n sein? – craftsman
Der Wert liegt bei Ihnen. Sie müssen Ihre Anwendung vergleichen, um den bestmöglichen Wert für den Ausgleich zwischen Speicher und Leistung zu erzielen. –