You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理60000行CSV文件写入H2数据库并解决仅处理前1000行问题

问题排查与解决方法

1. 排查CSV读取逻辑异常

  • 先在CSV读取代码中添加行数统计日志,确认是读取阶段仅获取到1000行,还是写入阶段丢失了数据。如果使用OpenCSV、commons-csv等第三方CSV处理工具,检查是否配置了读取行数限制参数,部分工具默认会设置读取上限,需手动修改为无限制。
  • 单独校验CSV文件第999~1001行的格式合法性,确认是否存在字段引号未闭合、分隔符异常、换行符错误等问题,导致读取逻辑提前终止。

2. 修复H2数据库写入配置问题

  • 优先开启批量写入模式:逐条插入极易触发内存溢出、事务超时等问题导致程序中断,建议按批次提交事务,参考JDBC批量写入逻辑如下:
// 关闭自动提交
connection.setAutoCommit(false);
String insertSql = "INSERT INTO target_table (col1, col2, col3) VALUES (?, ?, ?)";
PreparedStatement pstmt = connection.prepareStatement(insertSql);
int batchSize = 2000;
int count = 0;

// 逐行读取CSV并组装参数
for (CsvRow row : csvRowIterator) {
    pstmt.setString(1, row.getField1());
    pstmt.setString(2, row.getField2());
    pstmt.setString(3, row.getField3());
    pstmt.addBatch();
    count++;
    
    // 达到批次阈值后提交一次
    if (count % batchSize == 0) {
        pstmt.executeBatch();
        connection.commit();
        pstmt.clearBatch();
    }
}
// 提交剩余未处理的批次数据
pstmt.executeBatch();
connection.commit();
  • 调整H2数据库运行参数:默认H2的内存缓存、写入阈值较小,如果使用内存模式的H2,容易因内存不足触发写入中断,可以在JDBC连接URL中调大配置,示例:jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1;CACHE_SIZE=1048576,其中CACHE_SIZE单位为KB,上述配置代表设置1G缓存,可根据实际服务器配置调整。
  • 检查事务超时配置:如果使用Spring等开发框架,默认的事务超时时间可能不足以支撑6万行数据写入,需要手动调大事务超时阈值,或者配合上述批量提交逻辑拆分为多个小事务,避免单次事务执行时间过长。
  • 排查数据约束冲突:添加写入异常捕获逻辑,打印第1001行附近的具体数据内容,确认是否存在唯一键冲突、字段长度超限、类型不匹配等问题,导致写入中断且后续数据未执行。如果存在异常数据,可选择修复原始数据,或者添加异常行跳过逻辑保证正常数据写入。

3. 通用优化建议

  • 读取CSV时使用流式读取方案,不要一次性将全量6万行数据加载到内存中,避免OOM导致程序提前终止。
  • 补充全链路异常日志打印,确认程序是抛出异常中断还是静默退出,快速定位问题根因。

内容的提问来源于stack exchange,提问作者Vignesh S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:21:01