摘要:排查異常日志,發(fā)現(xiàn)沒(méi)有該問(wèn)題存在。測(cè)試功能正常,沒(méi)有重現(xiàn)線(xiàn)上問(wèn)題。解決問(wèn)題原因定位好了,剩下的就是如何解決了。兩個(gè)方案修改線(xiàn)上配置該上實(shí)施難度系數(shù)高,因?yàn)楣臼褂玫慕y(tǒng)一發(fā)布部署平臺(tái),開(kāi)發(fā)人員無(wú)服務(wù)器操作權(quán)限。
問(wèn)題
XX系統(tǒng)中,一個(gè)用戶(hù)需要維護(hù)的項(xiàng)目數(shù)過(guò)多,填寫(xiě)的任務(wù)數(shù)超多,產(chǎn)生了一次工時(shí)保存中,只有前面一部分的xx數(shù)據(jù)持久化到數(shù)據(jù)庫(kù),后面的數(shù)據(jù)沒(méi)有保存。
圖1
排查過(guò)程 1.增加日志,監(jiān)控參數(shù)信息首先想到的是否后面部分的數(shù)據(jù)在保存過(guò)程中發(fā)生了異常。排查異常日志,發(fā)現(xiàn)沒(méi)有該問(wèn)題存在。
然后增加方法參數(shù)信息日志,數(shù)據(jù)參數(shù)信息。發(fā)現(xiàn)參數(shù)集合size=200,前端發(fā)送集合size=400。判斷問(wèn)題可以能是因?yàn)榉?wù)器容器環(huán)境(Nginx+Tomcat)導(dǎo)致
2.開(kāi)發(fā)環(huán)境問(wèn)題重現(xiàn) 2.1 模擬數(shù)據(jù)在測(cè)試環(huán)境模擬線(xiàn)上數(shù)據(jù)。如圖1
2.2 只配置Tomcat在idea中直接啟動(dòng)tomcat,無(wú)nginx環(huán)境,如果沒(méi)有問(wèn)題,則可暫時(shí)確定為nginx問(wèn)題。
然而,在過(guò)程中發(fā)現(xiàn)了新的問(wèn)題。
org.springframework.beans.InvalidPropertyException: Invalid property "detail[256]" of bean class [com.suning.asvp.mer.entity.InviteCooperationInfo]: Index of out of bounds in property path "detail[256]"; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256 at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:833) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:576) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:553) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:914) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692) ~[spring-context-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.validation.DataBinder.doBind(DataBinder.java:588) ~[spring-context-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:191) ~[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE] at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:112) ~[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE]
查看BeanWrapperImpl源碼
else if (value instanceof List) { int index = Integer.parseInt(key); List list = (List) value; growCollectionIfNecessary(list, index, indexedPropertyName, pd, i + 1); value = list.get(index);// 測(cè)試報(bào)錯(cuò)時(shí),此處list只有256個(gè),index為256時(shí),取第257個(gè)報(bào)錯(cuò) }
@SuppressWarnings("unchecked") private void growCollectionIfNecessary( Collection collection, int index, String name, PropertyDescriptor pd, int nestingLevel) { if (!this.autoGrowNestedPaths) { return; } int size = collection.size(); // 當(dāng)個(gè)數(shù)小于autoGrowCollectionLimit這個(gè)值時(shí)才會(huì)向list中添加新元素 if (index >= size && index < this.autoGrowCollectionLimit) { Class elementType = GenericCollectionTypeResolver.getCollectionReturnType(pd.getReadMethod(), nestingLevel); if (elementType != null) { for (int i = collection.size(); i < index + 1; i++) { collection.add(newValue(elementType, name)); } } } }
根據(jù)上面的分析找到autoGrowCollectionLimit的定義
public class DataBinder implements PropertyEditorRegistry, TypeConverter { /** Default object name used for binding: "target" */ public static final String DEFAULT_OBJECT_NAME = "target"; /** Default limit for array and collection growing: 256 */ public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256; private int autoGrowCollectionLimit = DEFAULT_AUTO_GROW_COLLECTION_LIMIT;
解決方案,是在自己的Controller中加入如下方法
@InitBinder protected void initBinder(WebDataBinder binder) { binder.setAutoGrowNestedPaths(true); binder.setAutoGrowCollectionLimit(1024); }
==BUT 這個(gè)問(wèn)題和線(xiàn)上的不同,只能算是意外收獲。革命尚未成功,同志仍需努力!?。?!==
2.3 增加Nginx經(jīng)過(guò)2.2的奮斗,暫時(shí)判定是否為Nginx post請(qǐng)求參數(shù)做了限制。嗯,開(kāi)搞~ 在開(kāi)發(fā)環(huán)境配置Nginx代理,過(guò)程略·····
nginx.conf 如下
upstream xxxxxxx { server 127.0.0.1:8080 weight=10 max_fails=2 fail_timeout=30s ; } server { listen 80; server_name xxxxxxx.com; client_max_body_size 100M; # 配置post size #charset koi8-r; #access_log logs/host.access.log main; location / { #proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://xxxxxxx; expires 0; } }
對(duì)于client_max_body_size 100M;,網(wǎng)上都是與文件上傳相關(guān)的。不過(guò)都是通過(guò)post, request body的方式上傳數(shù)據(jù),所以通用。
測(cè)試~~
功能正常,沒(méi)有重現(xiàn)線(xiàn)上問(wèn)題。 哭死~~~
革命還要繼續(xù)~~
2.4 Tomcat post設(shè)置去線(xiàn)上服務(wù)器拉去配置
經(jīng)分析,發(fā)現(xiàn)線(xiàn)上沒(méi)有body size的配置,卻有maxParameterCount="1000"。該參數(shù)為限制請(qǐng)求的參數(shù)個(gè)數(shù),從而變相限制body size。
在開(kāi)發(fā)環(huán)境配置該參數(shù),測(cè)試,問(wèn)題重現(xiàn)。
3. 解決問(wèn)題原因定位好了,剩下的就是如何解決了。
兩個(gè)方案:
修改線(xiàn)上配置
該上實(shí)施難度系數(shù)高,因?yàn)楣臼褂玫慕y(tǒng)一發(fā)布部署平臺(tái),開(kāi)發(fā)人員無(wú)服務(wù)器操作權(quán)限。
修改代碼
修改保存邏輯,分片存儲(chǔ)
總結(jié)問(wèn)題排查,需要先對(duì)整體有個(gè)把握,然后分析影響范圍。不能鉆牛角尖,采用西醫(yī)“頭疼醫(yī)頭”的方式。有可能最后結(jié)果還是要醫(yī)頭,但此時(shí)的醫(yī)頭已經(jīng)是建立在中醫(yī)的辯證主義上,對(duì)癥下藥。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39871.html
摘要:排查異常日志,發(fā)現(xiàn)沒(méi)有該問(wèn)題存在。測(cè)試功能正常,沒(méi)有重現(xiàn)線(xiàn)上問(wèn)題。解決問(wèn)題原因定位好了,剩下的就是如何解決了。兩個(gè)方案修改線(xiàn)上配置該上實(shí)施難度系數(shù)高,因?yàn)楣臼褂玫慕y(tǒng)一發(fā)布部署平臺(tái),開(kāi)發(fā)人員無(wú)服務(wù)器操作權(quán)限。 問(wèn)題 XX系統(tǒng)中,一個(gè)用戶(hù)需要維護(hù)的項(xiàng)目數(shù)過(guò)多,填寫(xiě)的任務(wù)數(shù)超多,產(chǎn)生了一次工時(shí)保存中,只有前面一部分的xx數(shù)據(jù)持久化到數(shù)據(jù)庫(kù),后面的數(shù)據(jù)沒(méi)有保存。 圖1 showImg(htt...
摘要:排查異常日志,發(fā)現(xiàn)沒(méi)有該問(wèn)題存在。測(cè)試功能正常,沒(méi)有重現(xiàn)線(xiàn)上問(wèn)題。解決問(wèn)題原因定位好了,剩下的就是如何解決了。兩個(gè)方案修改線(xiàn)上配置該上實(shí)施難度系數(shù)高,因?yàn)楣臼褂玫慕y(tǒng)一發(fā)布部署平臺(tái),開(kāi)發(fā)人員無(wú)服務(wù)器操作權(quán)限。 問(wèn)題 XX系統(tǒng)中,一個(gè)用戶(hù)需要維護(hù)的項(xiàng)目數(shù)過(guò)多,填寫(xiě)的任務(wù)數(shù)超多,產(chǎn)生了一次工時(shí)保存中,只有前面一部分的xx數(shù)據(jù)持久化到數(shù)據(jù)庫(kù),后面的數(shù)據(jù)沒(méi)有保存。 圖1 showImg(htt...
摘要:直到有一天你會(huì)碰到線(xiàn)上奇奇怪怪的問(wèn)題,如線(xiàn)程執(zhí)行一個(gè)任務(wù)遲遲沒(méi)有返回,應(yīng)用假死。正好這次借助之前的一次生產(chǎn)問(wèn)題來(lái)聊聊如何排查和解決問(wèn)題。本地模擬上文介紹的是線(xiàn)程相關(guān)問(wèn)題,現(xiàn)在來(lái)分析下內(nèi)存的問(wèn)題。盡可能的減少多線(xiàn)程競(jìng)爭(zhēng)鎖。 showImg(https://segmentfault.com/img/remote/1460000015568421?w=2048&h=1150); 前言 之前或...
摘要:直接顯示了一個(gè)疑似內(nèi)存泄漏的問(wèn)題。然后分析文件給出的信息,發(fā)現(xiàn)一個(gè)叫的類(lèi)。文件里面說(shuō)的內(nèi)存泄漏的大概的意思就是說(shuō),這個(gè)類(lèi)里面的存放的東西太多了,爆掉了。修改了代碼將調(diào)用的地方改成了單例。修改完線(xiàn)上跑了一段日子,后來(lái)也沒(méi)有出現(xiàn)過(guò)這樣的問(wèn)題。 問(wèn)題描述: ????早上去公司上班,突然就郵件一直報(bào)警,接口報(bào)異常,然后去查服務(wù)器的運(yùn)行情況,發(fā)現(xiàn)java的cpu爆了.接著就開(kāi)始排查問(wèn)題 問(wèn)題解決...
閱讀 1892·2021-11-23 09:51
閱讀 1535·2021-11-19 09:40
閱讀 3209·2021-11-11 11:01
閱讀 1105·2021-09-27 13:34
閱讀 1835·2021-09-22 15:56
閱讀 2122·2019-08-30 15:52
閱讀 1061·2019-08-30 14:13
閱讀 3473·2019-08-30 14:10