局域网
里,别人使用C#写的程序,开了4个线程,往我接口里插入4张不同表的数据,问题如下:1.发现我的表里有很多重复数据,和对方确认后,发现对方用C#程序调用我的接口时,很多情况是因为tomcat没有及时返回response,导致对方的程序以为没有插入成功,又重新插入一遍。
但是我自己用java程序来模拟了100个请求,没有发现这种现象。
2.我觉得那个人写的程序可能超时时间设置的太短,因为我感觉在局域网的情况下,才开了4个线程,没有达到tomcat的瓶颈吧?(不知道这么想对不对)
3.要排除对方调用我的接口插入数据时,插入重复数据,我想了两种办法,不知道哪一个效率更好,或者大家有什么更好的去重方法
在数据库里设置主键,或者联合主键,让数据库帮我去判断数据是否重复
每次在插入数据的时候,我用程序去查询数据库里是否有重复数据,但是我觉得一旦数据量大的话,查询起来比较慢
謝謝主席邀請,
主席說的兩種方法都是一樣的,都是為了防止重複的方法,主要差別在於主鍵或唯一索引去重才能有效解決重複插入的問題,而在程序中去查重再插入,由於這兩個操作不是原子性的,依然不能防止有請求能在你查詢到插入之間進行插入,所以依然會有重複的風險。
只要請求量資料庫可以扛得住,可以用資料庫的唯一索引。也可以利用redis在應用層做唯一性判斷。
感覺這個問題的重點不是資料去重,而是那位同學為什麼在沒有接到操作失敗的消息時要發起重試。
建議用攔截器打日誌看看每次請求的處理時間.
呼叫的那邊應該要等待請求回應後再去做下一個操作,例如可以把請求超時時間設定短一點。
最簡單有效的方法就是建立唯一索引,暫時不用考慮效能問題。
如果真遇到資料庫瓶頸,估計架構早就不是現在這樣的了。