• postgres批量插入报错排查


    程序批量插入数据时报错,将sql在navicat执行又不报错。报错信息:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800

    查询资料参考资料发现postgreSQL JDBC驱动限定,client端的一个发送大小限制为2byte。
    也就是批量插入的时候values里面的参数个数(行数*列数)不能超过32767。建议批量插入的时候设置为1000行左右提交一次。

    引用:
    这里举两个代表性栗子:
    sql渣:

    for i in (1-1000):
    start transaction;
    insert into table values (1);
    commit;
    end for
    

    sql赞:

    start transaction;
    for i in (1-1000):
    insert into table values (1);
    end for
    commit;
    

    sql赞爆:

    insert into table values (1)()...........()(1000);
    

    首先,sql语法是我临时自创的,这个不是关键,关键在sql渣先生是1000个事务插1000行,日志flush1000次。sql赞先生是一个事务插1000行,事务日志flush1次。sql赞爆最nice。
    这个例子我想表达的意思是如果你要用sql做一件事,那就要尽量让这件事占用的事务总时间最少。

    第二个例子
    sql渣:

    update table where id > 0 and id < 1000000;
    

    sql赞:

    update table where id > 0 and id < 1000;
    update table where id >= 1000 and id < 2000;
    update table where id >= 2000 and id < 3000;
    

    ....
    ....
    这个例子我想表达的意思是如果你要用sql做一件很大的事,那就尽量让大事化成很多小事。
    两个例子好好体会下,一点不矛盾哦。补充一下,这里每个update都是单独事务

  • 相关阅读:
    数组
    Fiddler抓手机APP包
    APP测试注意点-安装卸载与运行
    【转】查看iOS崩溃日志
    Monkey 命令
    python del 函数
    探索性测试方法
    解决5037端口占用的方法
    App测试Android的闪退总结
    Jenkins邮件配置
  • 原文地址:https://www.cnblogs.com/zhangfx01/p/16169078.html
Copyright © 2020-2023  润新知