局域网
里,别人使用C#写的程序,开了4个线程,往我接口里插入4张不同表的数据,问题如下:1.发现我的表里有很多重复数据,和对方确认后,发现对方用C#程序调用我的接口时,很多情况是因为tomcat没有及时返回response,导致对方的程序以为没有插入成功,又重新插入一遍。
但是我自己用java程序来模拟了100个请求,没有发现这种现象。
2.我觉得那个人写的程序可能超时时间设置的太短,因为我感觉在局域网的情况下,才开了4个线程,没有达到tomcat的瓶颈吧?(不知道这么想对不对)
3.要排除对方调用我的接口插入数据时,插入重复数据,我想了两种办法,不知道哪一个效率更好,或者大家有什么更好的去重方法
在数据库里设置主键,或者联合主键,让数据库帮我去判断数据是否重复
每次在插入数据的时候,我用程序去查询数据库里是否有重复数据,但是我觉得一旦数据量大的话,查询起来比较慢
의장님, 초대해 주셔서 감사합니다.
의장님께서 말씀하신 두 가지 방법은 모두 중복을 방지하기 위한 방법입니다. 가장 큰 차이점은 기본 키 중복을 효과적으로 해결할 수 있다는 것입니다. 반복 삽입 문제 프로그램에서 중복을 확인한 다음 삽입합니다. 이 두 작업은 원자성이 아니기 때문에 쿼리와 삽입 사이에 요청이 삽입되는 것을 방지할 수 없으므로 여전히 중복 위험이 있습니다.
데이터베이스가 요청량을 처리할 수 있는 한 데이터베이스의 고유 인덱스를 사용할 수 있습니다. Redis를 사용하여 애플리케이션 계층에서 고유성을 판단할 수도 있습니다.
이 질문의 초점은 데이터 중복 제거가 아니라 작업이 실패했다는 메시지를 받지 못했는데 왜 학생이 재시도를 시작했는지에 있는 것 같습니다.
각 요청의 처리 시간을 확인하려면 인터셉터를 사용하여 로그하는 것이 좋습니다.
발신자는 다음 작업을 수행하기 전에 요청 응답을 기다려야 합니다. 예를 들어 요청 시간 제한을 더 짧게 설정할 수 있습니다.
가장 간단하고 효과적인 방법은 당분간 성능 문제를 고려하지 않고 고유한 인덱스를 구축하는 것입니다.
정말로 데이터베이스 병목 현상이 발생한다면 아키텍처가 지금과 같지 않을 것으로 추정됩니다.