局域网
里,别人使用C#写的程序,开了4个线程,往我接口里插入4张不同表的数据,问题如下:1.发现我的表里有很多重复数据,和对方确认后,发现对方用C#程序调用我的接口时,很多情况是因为tomcat没有及时返回response,导致对方的程序以为没有插入成功,又重新插入一遍。
但是我自己用java程序来模拟了100个请求,没有发现这种现象。
2.我觉得那个人写的程序可能超时时间设置的太短,因为我感觉在局域网的情况下,才开了4个线程,没有达到tomcat的瓶颈吧?(不知道这么想对不对)
3.要排除对方调用我的接口插入数据时,插入重复数据,我想了两种办法,不知道哪一个效率更好,或者大家有什么更好的去重方法
在数据库里设置主键,或者联合主键,让数据库帮我去判断数据是否重复
每次在插入数据的时候,我用程序去查询数据库里是否有重复数据,但是我觉得一旦数据量大的话,查询起来比较慢
谢谢主席邀请,
主席说的两种方法都是一样的,都是为了防止重复的方法,主要差别在于主键或者唯一索引去重才能有效解决重复插入的问题,而在程序中去查重再插入,由于这两个操作不是原子性的,依然不能防止有请求能在你查询到插入之间进行插入,所以依然会有重复的风险。
只要请求量数据库可以扛得住,可以用数据库的唯一索引。也可以利用redis在应用层做唯一性判断。
感觉这个问题的重点不是数据去重,而是那位同学为什么在没有接到操作失败的消息时要发起重试。
建议用拦截器打日志看看每次请求的处理时间.
调用的那边应该要等待请求响应后再去做下一个操作,例如可以把请求超时时间设置短一点。
最简单有效的方法就是建唯一索引,暂时不用考虑性能问题。
如果真遇到数据库瓶颈,估计架构早就不是现在这样的了。