測試環境
- 資料表:
test(id int PK, txt varchar(70)),id 建立索引
- 插入 10 萬筆,內容為「這條記錄是第=序號」
- 關閉自動提交(
con.setAutoCommit(false)),最後統一 commit()
- 使用
PreparedStatement 參數化插入
關鍵程式碼片段
con.setAutoCommit(false);
for (int i = 1; i <= 100000; i++) {
String info = "這條記錄是第=" + i;
PreparedStatement pstmt = con.prepareStatement(
"insert into test (id,txt) values(?,?)");
pstmt.setInt(1, i);
pstmt.setString(2, info);
pstmt.executeUpdate();
}
con.commit();
不同 JDBC 驅動版本測試結果
| 驅動版本 | 最大成功筆數 | 耗時 | 中文支援 | 備註 |
| 3.1.7 / 3.1.12 | ~1.2 萬 | - | 正常 | OOM:Java heap space |
| 3.0.16-ga | 10 萬 | 98.6 秒 | 正常 | 唯一完整通過 |
| 3.0.10 | 10 萬 | - | 亂碼 | 中文編碼問題 |
| jTDS (SQL Server) | 10 萬 | 1746 秒 | - | 效能極差 |
結論與建議
- MySQL 官方 3.0.16-ga 版本最穩定,記憶體佔用低
- 3.1.x 系列需較大 Heap(
-Xmx512m 以上)
- 批量插入務必:關閉自動提交 + PreparedStatement 重用 + 批次執行(addBatch/executeBatch),可再提升 10 倍以上效能
- 測試機記憶體不足時易觸發 OOM,建議調大 JVM 堆或分批提交