花了一天時(shí)間在處理一個(gè)Excel數(shù)據(jù)上傳如筛,但數(shù)據(jù)總是提交不全的問(wèn)題躁锡。
Excel解析出的內(nèi)容差不多 5000 行,每行大概 10 列筒溃,也就是 5W 左右個(gè)數(shù)據(jù)马篮。
整個(gè)過(guò)程需要上傳、預(yù)覽怜奖、建立字段映射后浑测,再提交,保存到數(shù)據(jù)庫(kù)歪玲。
這個(gè)吐血的Bug尽爆,前前后后差不多調(diào)試了5、6個(gè)小時(shí)读慎。
前面的幾步統(tǒng)統(tǒng)SO Easy漱贱,輕松解決,但是提交這5W個(gè)數(shù)據(jù)時(shí)夭委,遇到一個(gè)坑幅狮。
- SpringMVC 接收List/數(shù)組大小默認(rèn)限制為256個(gè)
簡(jiǎn)單搜索下網(wǎng)頁(yè),輕松找到了解決辦法株灸。
在需要問(wèn)題發(fā)生的Controller中崇摄,增加
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setAutoGrowNestedPaths(true);
binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);
}
考慮不想以后再重復(fù)處理,將這段代碼放到了@ControlerAdvice標(biāo)注的全局Controller異常處理器類中慌烧。
網(wǎng)上給出的全局配置比較麻煩逐抑,官方文檔給出的是基于XML的配置方法,考慮項(xiàng)目使用的SpringBoot屹蚊,想?yún)⒖甲鯦ava Config沒(méi)成功厕氨。
試著放到@ControlerAdvice標(biāo)注的類中,貌似成功了汹粤,后來(lái)又搜了一遍官方文檔:
@Controller or @ControllerAdvice classes can have @InitBinder methods that initialize instances of WebDataBinder
哈命斧,原來(lái)確實(shí)可以這么干!
- Post方式發(fā)送請(qǐng)求嘱兼,SpringMVC 接收為空
無(wú)論怎么發(fā)送国葬,服務(wù)端收到始終是null,貌似數(shù)據(jù)被丟棄芹壕,沒(méi)有被正確接收汇四。
同樣搜索一番,發(fā)現(xiàn)是服務(wù)器對(duì)Post大小限制的問(wèn)題踢涌。
不是理論上Post大小無(wú)限嗎通孽?現(xiàn)實(shí)是,大多服務(wù)器都進(jìn)行了容量限制斯嚎,如 Tomcat 默認(rèn)Post請(qǐng)求的數(shù)據(jù)大小是2M利虫。
看帖子挨厚,翻Tomcat Doc堡僻,找到解決方法是:
(1)使用 Tomcat 作為服務(wù)器
修改Tomcat server.xml配置糠惫,取消Post請(qǐng)求大小限制
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="19443"
maxPostSize="-1"/>
關(guān)鍵部分是在Connector元素中增加 maxPostSize
屬性,并設(shè)置為 -1
钉疫,表示不限制硼讽。
注意:Tomcat版本有差異,7之前設(shè)置0牲阁,之后(包括7)設(shè)置-1固阁。
(2)使用SpringBoot內(nèi)嵌的Tomcat
SpringBoot嵌入的Tomcat也提供了對(duì)應(yīng)的配置
- servet.tomcat.max-http-post-size=-1
兩種我都修改了。
- 超級(jí)巨坑城菊,請(qǐng)求參數(shù)個(gè)數(shù)限制默認(rèn)為10000
那個(gè)Bug來(lái)的备燃,防不勝防啊,凌唬,并齐,開發(fā)不易,產(chǎn)品且用且珍惜客税。
按理說(shuō)况褪,折騰這么久,問(wèn)題應(yīng)該解決了更耻,但是無(wú)論怎么測(cè)試數(shù)據(jù)只能接受到1111個(gè)VO對(duì)象测垛。
這時(shí)候我仍以為是Post數(shù)據(jù)大小限制的修改沒(méi)有生效,繼續(xù)重啟多次秧均,測(cè)試N遍食侮,問(wèn)題依舊,數(shù)量不增不減目胡,始終只能接收1111個(gè)VO對(duì)象過(guò)來(lái)疙描。
折磨了2個(gè)多小時(shí),心力交瘁讶隐,無(wú)心編程起胰。算了,睡2小時(shí)去(周日在家巫延,非上班時(shí)間)效五。
睡醒,夜半炉峰,挑燈再戰(zhàn)畏妖。
Chrome關(guān)鍵時(shí)刻也不給力,想查看請(qǐng)求數(shù)據(jù)量大小疼阔,卡戒劫、卡半夷、卡,緩慢出來(lái)一看3144834迅细,這應(yīng)該不算大吧巫橄。
重新搜索:SpringMVC List 個(gè)數(shù)限制
突然找到 "Tomcat配置,參數(shù)個(gè)數(shù)maxParameterCount默認(rèn)個(gè)數(shù)10000"茵典。
簡(jiǎn)單計(jì)算一番1111個(gè)VO對(duì)象湘换,剛好,每個(gè)有9個(gè)屬性值统阿,正好約1W彩倚,一口老血。
解決辦法:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="19443" maxPostSize="-1" maxParameterCount="-1"/>
中間也走了一些歧途扶平,嘗試配置過(guò)maxHttpHeaderSize ="102400" maxSwallowSize="-1"帆离。
不能嘆氣,容易老结澄。
問(wèn)題解決了哥谷。