He escrito un método insert()
en el que estoy tratando de usar JDBC por lotes para la inserción de medio millón de registros en una base de datos MySQL:lotes JDBC Insertar 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);
}
}
Pero cada vez que intento ejecutar este método, me sale el siguiente error:
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)
Si sustituyo ps.addBatch()
con ps.executeUpdate()
y retire ps.executeBatch()
, que funciona bien, aunque se tarda un poco de tiempo. Por favor, avíseme si sabe si usar Batch es apropiado en esta situación, y si lo es, ¿por qué da OurOfMemoryError
?
Gracias
y cuál debería ser el valor de n? – craftsman
El valor depende de usted, tiene que comparar su aplicación para obtener el mejor valor que desea para la compensación entre la memoria y el rendimiento. –