小弟最近在改后端項(xiàng)目,但出了個(gè) bug 又解決不了,我覺(jué)得是我的后端知識(shí)太欠缺了,特來(lái)這里請(qǐng)教。流程是這樣的,前端有上送信息,接口收到信息后,用收到的部分信息再去第三方接口請(qǐng)求信息,把兩部分合起來(lái)存儲(chǔ)。收到的信息中有一部分是用戶ID(絕不重復(fù)),我用這個(gè) ID + 收到信息的時(shí)刻(精確到秒)做 md5,生成一個(gè)唯一的序列號(hào)作為主鍵。但是有些時(shí)候是上傳失敗的,日志是這么記錄的Could not execute JDBC batch update …… Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (SIT_QDYY.SYS_C0010324) violated我看了下日志,有兩條一模一樣的信息,按照我上面說(shuō)的生成序列號(hào)的方法,這樣肯定會(huì)重復(fù)。我和前端確認(rèn)了下,說(shuō)是不會(huì)有一秒鐘上傳兩次的情況,所以我想是不是我收到信息后的網(wǎng)絡(luò)請(qǐng)求比較耗時(shí)導(dǎo)致的(再想不出別的原因了)?而且,每一條上傳信息不是按順序處理的,比如說(shuō),接口收到了 A 信息,然后解析,打印日志,還沒(méi)存下來(lái),B 信息的日志就被記錄下來(lái)了,后面再是用 A 的信息請(qǐng)求第三方接口,存儲(chǔ),等等我的猜測(cè):服務(wù)器是多線程的,每時(shí)每刻都在處理請(qǐng)求,而用 A 請(qǐng)求的數(shù)據(jù)再去請(qǐng)求第三方接口比較耗時(shí),所以 B 請(qǐng)求來(lái)到以后,就去處理 B ,另開(kāi)一個(gè)線程去第三方接口獲取 A 相關(guān)的數(shù)據(jù)(這里都是猜測(cè),而且和我那個(gè) bug 有啥關(guān)系也不清楚)?項(xiàng)目用的是 Struts2 + Hibernate + Oracle,部署在 Weblogic 上。
1 回答

郎朗坤
TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
js雖然是單線程的,但是請(qǐng)求是可以連續(xù)發(fā)的,而且加上各種網(wǎng)絡(luò)延時(shí),可能就造成同時(shí)到達(dá),另外你服務(wù)器也可能把任務(wù)放在隊(duì)列中,每次取個(gè)幾個(gè)出來(lái)處理
再加一個(gè)隨機(jī)數(shù)吧
添加回答
舉報(bào)
0/150
提交
取消