简介
接到一个任务:将项目中的部分代码功能抽成可执行 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 的批量操作在做的时候竟然写不出来,还需要查资料,囧
特此记录,加深印象