Tôi đã viết một phương pháp insert()
trong đó tôi đang cố gắng sử dụng JDBC hàng loạt cho chèn nửa triệu bản ghi vào cơ sở dữ liệu MySQL:hàng loạt JDBC Chèn 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);
}
}
Nhưng bất cứ khi nào tôi cố gắng chạy phương pháp này, tôi nhận được lỗi sau:
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)
Nếu tôi thay ps.addBatch()
với ps.executeUpdate()
và loại bỏ ps.executeBatch()
, nó hoạt động tốt, mặc dù phải mất một thời gian. Xin vui lòng cho tôi biết nếu bạn biết nếu sử dụng hàng loạt là thích hợp trong tình huống này, và nếu có, thì tại sao nó cung cấp cho OurOfMemoryError
?
Cảm ơn
và giá trị n là gì? – craftsman
Giá trị tùy thuộc vào bạn, bạn phải đánh giá ứng dụng của mình để có được giá trị tốt nhất mà bạn muốn cho việc giao dịch giữa bộ nhớ và hiệu suất. –