jdbc 执行批量 update 的效率问题

查看 67|回复 4
作者:qee   
最近客户要对数据库存储的数据做国密改造,提供了相关的加密 sdk ,原来的数据库表存储的数据要升级成密文。
现在就想用原生的 jdbc 读出数据原文加密后存再进去,但是执行 batchexecute()的方法一次 1000 条,发现巨慢,按我查到都是推荐批量更新,但我这个就是巨慢。然后搞了测试表,结构里的索引什么的都删了还是慢。
数据库情况:postgre ,单表有 100+W 的数据,加密更新四五个字段
代码大致:
    connection.setAutoCommit(false);
    PreparedStatement preparedStatement = connection.prepareStatement("update users set name = ? where id = ?");
        for(int =i;i
这个哪位有好的优化思路吗,或者别的方案

jdbc, MIT, 加密, 数据库

lqw3030   
整个表读出来改(高性能机器/分布式计算),改完写到 table_modified,然后重命名下表
ZhanXinjia   
这么搞肯定慢。
第一点:不要用框架,框架比较耗时,直接用 jdbc 手写 sql 注入。(要看国密是否有转移字符问题,如果没有直接注入)
第二点:换一个方式写 sql ,做临时表 m:
就是把你之前这样的语句:
begin;
update t1 set c2=2 where c1=1;
update t1 set c2=3 where c1=2;
update t1 set c2=4 where c1=3;
update t1 set c2=5 where c1=4;
update t1 set c2=6 where c1=5;
commit;
优化成:
UPDATE t1 m, (
SELECT 1 AS c1, 2 AS c2
UNION ALL
SELECT 2, 3
UNION ALL
SELECT 3, 4
UNION ALL
SELECT 4, 5
UNION ALL
SELECT 5, 6
) r
SET m.c1 = r.c1, m.c2 = r.c2
WHERE m.c1 = r.c1;
第三点:多线程干。
ZhanXinjia   
之前做过类似的加密,一分钟可以加密 50 万条左右
cubecube   
id 上的索引你得留着呀
您需要登录后才可以回帖 登录 | 立即注册

返回顶部