首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

Java mysql 动态 insert 一张表时,怎么防止 sql 语句过长

  •  
  •   rizon · 61 天前 via iPhone · 1546 次点击
    这是一个创建于 61 天前的主题,其中的信息可能已经有所发展或是发生改变。
    java 使用 mybatis
    表是动态生成的。数据也是动态插入的。因此字段数量,每个字段的数据都是动态的。
    那么问题来了,当字段或每个字段的 value 值过长时,就会导致 sql 过长,无法写入数据。

    这个东西有什么好的限制或解决方案吗?现成的工具最好。

    我能想到的方案就是计算字段与字段值的长度,然后动态地设置分批写数据时每个批次的大小
    第 1 条附言  ·  59 天前
    问题 已经解决了,写了个方法,按照字节大小来分批插入,而不是按照条数来分批。
    第 2 条附言  ·  59 天前
    问题 已经解决了,写了个方法,按照字节大小来分批插入,而不是按照条数来分批。
    字节大小则是根据‘ max_allowed_packet ’来配置的。
    感谢 v 友们的帮助
    12 回复  |  直到 2019-08-20 14:06:31 +08:00
        1
    rizon   61 天前 via iPhone
    问题 2,当 mysql 使用最大字段数量,每个字段使用最大长度的字符串作为值,那么插入一条数据时会超过 sql 长度吗?
        2
    sandrew1945   61 天前
    试试预编译
        4
    519718366   61 天前
    字段过长导致插入失败,这是设计上的坑啊,要么加大长度,要么代码里截断。你代码里正常写就行,每个公司的监控系统就监控这种异常情况的。
    比如爬虫数据落库,你数据库 title 是 varchar(1024) 结果哪天就爬了个 2000 长度的标题,那插入肯定就挂了,这时候我肯定是代码里做截断,毕竟这种数据是少数。

    整个 sql 怕超长,就用 batch 模式吧,一般情况下 <foreach>就顶用了
        5
    rizon   61 天前 via iPhone
    @sandrew1945
    @519718366
    你们没明白,如果字段数量非常多,每个字段的值本就非常长。那么分批分几条数据的一批是要看每条数据的长度的。
    甚至可能出现一条数据的长度就已经超过了 sql 的长度了
        6
    jugelizi   61 天前
    黑人问号???
    这个时候难道不是要改 packet size
        7
    340244120w   61 天前 via iPhone
    max allowed packet???
        8
    aprilwei   61 天前 via Android
    取消自动提交,batch 缓存
        9
    lihongjie0209   60 天前
    sql 还有长度一说??? 应该是 max allowed packet 吧
        10
    msg7086   60 天前 via Android
    不改设置改代码,是吃得很饱么…
        11
    Aresxue   60 天前
    sql 没有限制长度。而且这种批量代码你也是敢写,都超过内存最大限制了,说明一条 sql 里有太多条记录,max allowed packet 的本义就是让你拆分 sql,试想你 10w 里面有一条失败了,如果是 mysql 默认的严格模式你这 10w 条就都白插了。而且长时间 IO 可能给系统带来非常大的负荷,不谈死锁什么的,很有可能还会超时(jdbc 的超时时间, net_write_timeout 的超时时间, connect_timeout 的超时时间你都要考虑)。。。请想清楚你要干什么兄弟
        12
    leafin   60 天前
    我教你,
    max_allowed_packet=1G
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   943 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 19:30 · PVG 03:30 · LAX 12:30 · JFK 15:30
    ♥ Do have faith in what you're doing.