java - 别人调用我接口,往我数据库里插数据问题,谢谢
PHP中文网
PHP中文网 2017-04-18 09:07:15
0
5
525

局域网里,别人使用C#写的程序,开了4个线程,往我接口里插入4张不同表的数据,问题如下:

  • 1.发现我的表里有很多重复数据,和对方确认后,发现对方用C#程序调用我的接口时,很多情况是因为tomcat没有及时返回response,导致对方的程序以为没有插入成功,又重新插入一遍。

    • 但是我自己用java程序来模拟了100个请求,没有发现这种现象。

  • 2.我觉得那个人写的程序可能超时时间设置的太短,因为我感觉在局域网的情况下,才开了4个线程,没有达到tomcat的瓶颈吧?(不知道这么想对不对)

  • 3.要排除对方调用我的接口插入数据时,插入重复数据,我想了两种办法,不知道哪一个效率更好,或者大家有什么更好的去重方法

    • 在数据库里设置主键,或者联合主键,让数据库帮我去判断数据是否重复

    • 每次在插入数据的时候,我用程序去查询数据库里是否有重复数据,但是我觉得一旦数据量大的话,查询起来比较慢

谢谢

PHP中文网
PHP中文网

认证0级讲师

모든 응답(5)
PHPzhong

의장님, 초대해 주셔서 감사합니다.
의장님께서 말씀하신 두 가지 방법은 모두 중복을 방지하기 위한 방법입니다. 가장 큰 차이점은 기본 키 중복을 효과적으로 해결할 수 있다는 것입니다. 반복 삽입 문제 프로그램에서 중복을 확인한 다음 삽입합니다. 이 두 작업은 원자성이 아니기 때문에 쿼리와 삽입 사이에 요청이 삽입되는 것을 방지할 수 없으므로 여전히 중복 위험이 있습니다.

Ty80

데이터베이스가 요청량을 처리할 수 있는 한 데이터베이스의 고유 인덱스를 사용할 수 있습니다. Redis를 사용하여 애플리케이션 계층에서 고유성을 판단할 수도 있습니다.

小葫芦

이 질문의 초점은 데이터 중복 제거가 아니라 작업이 실패했다는 메시지를 받지 못했는데 왜 학생이 재시도를 시작했는지에 있는 것 같습니다.
각 요청의 처리 시간을 확인하려면 인터셉터를 사용하여 로그하는 것이 좋습니다.

Ty80

발신자는 다음 작업을 수행하기 전에 요청 응답을 기다려야 합니다. 예를 들어 요청 시간 제한을 더 짧게 설정할 수 있습니다.

巴扎黑

가장 간단하고 효과적인 방법은 당분간 성능 문제를 고려하지 않고 고유한 인덱스를 구축하는 것입니다.
정말로 데이터베이스 병목 현상이 발생한다면 아키텍처가 지금과 같지 않을 것으로 추정됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿