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

Oracle 12c批量插入异常:879条记录未入库且无报错求助

批量插入Oracle 12c时879条记录文件无插入无报错的排查方案

问题场景

批量读取文件解析后插入Oracle 12c数据库,多数文件执行正常,但某含879条记录的文件无记录插入且未抛出任何错误;对该文件增减1条记录后,代码可正常执行,且文件本身无内容问题。

相关代码

ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
List<CompletableFuture<Void>> completableFutures = 
     pnlFiles.stream().map(pnlFileForTheBook -> CompletableFuture.runAsync(() -> {
            String pnlFileName = "";
            String cobDate = "";
            String filePath = "";
            try {
                File localPnlFile = nasDataLoader.downloadFile(pnlFileForTheBook, filePath);
                if(localPnlFile != null) {
                    List<PnlFile> pnlFileLines = parse(localPnlFile, PnlFile.class);
                    List<PnlFileDsl> pnlFileDsls = pnlFileLines.stream().map(line -> {
                        return new PnlFileDsl(line, cobDate);
                    }).collect(Collectors.toList());
                    persistenceManager.persist(pnlFileDsls);
                }
            } 
            catch () {} 
        }, executorService)).collect(Collectors.toList());

List<Void> result = completableFutures.stream().map(CompletableFuture::join)
                                       .collect(Collectors.toList());

排查方向

1. 异常被完全静默吞噬

代码中的空catch () {}块会吞噬所有异常,包括下载、解析、插入环节的错误。879条记录的文件很可能在执行过程中抛出了异常,但没有任何日志或提示,导致插入逻辑中断却无法察觉。

  • 立即修复:在catch块中添加详细日志,比如捕获Exception并记录堆栈信息:
    catch (Exception e) {
        // 替换为实际日志组件
        System.err.printf("处理文件%s时失败: %s%n", pnlFileForTheBook, e.getMessage());
        e.printStackTrace();
    }
    

2. 批量插入的事务/提交问题

  • 检查persistenceManager.persist(pnlFileDsls)的实现:是否存在批量阈值设置?比如当记录数等于879时,事务未正确提交,或触发了隐式回滚。
  • 查看JDBC批量配置:Oracle JDBC的setBatchSize参数如果设置为879,可能出现提交异常;部分持久化框架会自动拆分批量,若拆分逻辑在879条时出现问题,也会导致插入失败。
  • 事务超时:879条记录的插入耗时刚好触达事务超时时间,导致框架静默回滚事务,未抛出异常。

3. 并发执行的资源冲突

代码使用异步线程池执行插入,879条记录的文件可能遇到数据库连接池耗尽、锁竞争等问题:

  • 检查连接池配置:最大连接数是否足够,是否存在连接超时、等待超时的日志。
  • 查询Oracle数据库的锁状态:通过v$lock、v$session视图查看是否存在锁等待或死锁,确认并发插入时是否有资源冲突导致插入失败。

4. 解析环节的隐形失败

  • 检查parse方法:是否存在批量解析到某条记录时出错,返回空列表的情况?比如第879条记录存在隐形格式问题,导致解析失败但未抛出异常,最终没有数据传入persist方法。
  • 验证映射逻辑:PnlFile转PnlFileDsl的过程中,是否存在字段不匹配导致的静默失败,进而触发批量插入被跳过。

5. Oracle数据库的特殊限制

  • 批量插入语句长度限制:如果使用INSERT ALL语法,879条记录生成的SQL语句可能超过Oracle允许的最大语句长度,导致执行失败但JDBC驱动未返回错误。
  • 查看数据库告警日志:检查Oracle的alert.log,查找是否有Ora-开头的错误码,确认是否存在数据库层面的插入失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:55:18