【提问】未解决-jdbc 批量执行卡住(没有返回结果也没有报异常)-Java专区论坛-技术-SpringForAll社区

提问未解决-jdbc 批量执行卡住(没有返回结果也没有报异常)

在项目中使用jdbc执行批量sql,偶然发下一个问题

当多个insert语句在一个字符串中,当字符串到一定长度时,批量执行后没有返回也没有抛异常

大概示例代码如下

/**
     * 批量执行sql,报错后会回滚
     *
     * @param conn
     * @param sqlList
     * @return
     * @throws SQLException
     */
    private int[] executeBatchSQL(Connection conn, List<String> sqlList) throws SQLException {
        boolean oldComit = conn.getAutoCommit();
        try {
            conn.setAutoCommit(false);
            Statement stat = conn.createStatement();
            // 传入的sqlList中一条sql可能包含了很多条语句
            // 测试过程中当sql长度超过200K时,可能造成插入数据之后程序假死,数据库有执行插入语句,但是方法始终未返回
            for (String sql : sqlList) {
                stat.addBatch(sql);
            }
            String sqlAll = StringUtil.join(sqlList, ";");
            LOGGER.info("开始执行,sql字符串长度:{},sql:{}", sqlAll.length(), sqlAll);
            int[] results = stat.executeBatch();
            LOGGER.info("执行结束,结果:{}", JacksonUtils.toJson(results));
            stat.close();
            LOGGER.info("Statement 关闭");
            conn.commit();
            LOGGER.info("事务提交");
            return results;
        } catch (Exception e) {
            conn.rollback();
            throw e;
        } finally {
            conn.setAutoCommit(oldComit);
        }
    }

调用大概是

String sql = “insert into ......;insert into ......;insert into ......;insert into ......;”;
List<String> sqlList = new ArrayList<>();
sqlList.add(sql);
int[] execResult = executeBatchSQL(conn, sqlList);

执行结果

1.png

执行的sql本身没有问题,在navcate中能执行成功(但是navcate好像是单条执行的);

数据库里面对应的数据也插入了,就是事务提交那一步没有返回结果

如果debug模式,加断点一步一步的过又可以执行成功

有碰到的帮忙看看是什么情况吗

请登录后发表评论

    • 奔牛的头像-SpringForAll社区奔牛作者0