This topic created in 2470 days ago, the information mentioned may be changed or developed.
java 使用 mybatis
表是动态生成的。数据也是动态插入的。因此字段数量,每个字段的数据都是动态的。
那么问题来了,当字段或每个字段的 value 值过长时,就会导致 sql 过长,无法写入数据。
这个东西有什么好的限制或解决方案吗?现成的工具最好。
我能想到的方案就是计算字段与字段值的长度,然后动态地设置分批写数据时每个批次的大小
Supplement 1 · Aug 22, 2019
问题 已经解决了,写了个方法,按照字节大小来分批插入,而不是按照条数来分批。
Supplement 2 · Aug 22, 2019
问题 已经解决了,写了个方法,按照字节大小来分批插入,而不是按照条数来分批。
字节大小则是根据‘ max_allowed_packet ’来配置的。
感谢 v 友们的帮助
12 replies • 2019-08-20 14:06:31 +08:00
 |
|
1
rizon Aug 19, 2019 via iPhone
问题 2,当 mysql 使用最大字段数量,每个字段使用最大长度的字符串作为值,那么插入一条数据时会超过 sql 长度吗?
|
 |
|
4
519718366 Aug 19, 2019
字段过长导致插入失败,这是设计上的坑啊,要么加大长度,要么代码里截断。你代码里正常写就行,每个公司的监控系统就监控这种异常情况的。 比如爬虫数据落库,你数据库 title 是 varchar(1024) 结果哪天就爬了个 2000 长度的标题,那插入肯定就挂了,这时候我肯定是代码里做截断,毕竟这种数据是少数。
整个 sql 怕超长,就用 batch 模式吧,一般情况下 <foreach>就顶用了
|
 |
|
5
rizon Aug 19, 2019 via iPhone
@ sandrew1945 @ 519718366 你们没明白,如果字段数量非常多,每个字段的值本就非常长。那么分批分几条数据的一批是要看每条数据的长度的。 甚至可能出现一条数据的长度就已经超过了 sql 的长度了
|
 |
|
6
jugelizi Aug 19, 2019
黑人问号??? 这个时候难道不是要改 packet size
|
 |
|
7
340244120w Aug 20, 2019 via iPhone
max allowed packet???
|
 |
|
8
aprilwei Aug 20, 2019 via Android
取消自动提交,batch 缓存
|
 |
|
9
lihongjie0209 Aug 20, 2019
sql 还有长度一说??? 应该是 max allowed packet 吧
|
 |
|
10
msg7086 Aug 20, 2019 via Android
不改设置改代码,是吃得很饱么…
|
 |
|
11
Aresxue Aug 20, 2019
sql 没有限制长度。而且这种批量代码你也是敢写,都超过内存最大限制了,说明一条 sql 里有太多条记录,max allowed packet 的本义就是让你拆分 sql,试想你 10w 里面有一条失败了,如果是 mysql 默认的严格模式你这 10w 条就都白插了。而且长时间 IO 可能给系统带来非常大的负荷,不谈死锁什么的,很有可能还会超时(jdbc 的超时时间, net_write_timeout 的超时时间, connect_timeout 的超时时间你都要考虑)。。。请想清楚你要干什么兄弟
|
 |
|
12
leafin Aug 20, 2019
我教你, max_allowed_packet=1G
|