JDBC

Apr 2, 2020


简介

接到一个任务:将项目中的部分代码功能抽成可执行 jar
为了 jar 包尽可能小,所以没有使用数据库连接池,而是用了 JDBC 操作数据库

问题

第一版写完测试了下,不到九万的数据用时 3700 多秒,61 分钟多,囧
数据库操作的核心代码就下面三句:

conn = getConnection();
ps = conn.prepareStatement(sql);
i = ps.executeUpdate();

每条记录插一次,性能低的令人发指,自然就想到了改批量了

改进

在原本只传递一个 sql 基础上增加一个 List<Map<String, String>> list 参数用于存储 sql 的变量,代码修改为:

conn = getConnection();
ps = conn.prepareStatement(sql);
conn.setAutoCommit(false);
for (Map<String, String> map : list) {
    ps.setString(1, map.get("id"));
    ps.setString(2, map.get("relationId"));
    ps.setString(3, map.get("policyId"));
    ps.addBatch();
}
result = ps.executeBatch();
conn.commit();

由于业务的关系,这不到九万的数据是分成了大概 250 次批量提交的,每次提交少的只有 1 条记录,多的有 2000 来条

改批量之后再次测试,用时大概 30 秒,可以满足需求

后记

之所以记录这个简单的问题,是因为 JDBC 的批量操作在做的时候竟然写不出来,还需要查资料,囧
特此记录,加深印象