Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.mysql.jdbc.PreparedStatement.<init>(PreparedStatement.java:437)
...
at tree.database.MySQLCor.insert(MySQLCor.java:263)
PreparedStatement 物件在建立時會在 JVM 堆分配記憶體緩衝 SQL 與參數。conn.prepareStatement(sql) 產生大量 PreparedStatement 實例,若未及時 close() 或批次提交,堆積導致 OOM。java -Xms512m -Xmx2g -jar your-app.jar
String sql = "INSERT INTO t(...) VALUES(...)";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
for (int i = 0; i < total; i++) {
ps.setString(1, ...); ...
ps.addBatch();
if (i % 1000 == 0) { ps.executeBatch(); conn.commit(); }
}
ps.executeBatch(); conn.commit();
}
conn.setAutoCommit(false),手動控制事務邊界。rewriteBatchedStatements=true 連線參數,驅動端合併批次 SQL 減少網路交互。大量寫入必須「批次、重用、手動提交」,單純調大堆只能延緩崩潰。