Ho scritto un metodo insert()
in cui sto cercando di utilizzare JDBC batch per l'inserimento di mezzo milione di record in un database MySQL:batch JDBC Inserire 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);
}
}
Ma ogni volta che provo a fare funzionare questo metodo, ho ottenere il seguente errore:
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)
Se sostituisco ps.addBatch()
con ps.executeUpdate()
e rimuovere ps.executeBatch()
, funziona benissimo, anche se ci vuole un po 'di tempo. Per favore fatemi sapere se sapete se usare Batch è appropriato in questa situazione, e se lo è, allora perché dà OurOfMemoryError
?
Grazie
e quale dovrebbe essere il valore di n? – craftsman
Il valore spetta a te, devi confrontare la tua applicazione per ottenere il miglior valore per quello che vuoi per il trade off tra memoria e prestazioni. –