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

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

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

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

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

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

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

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

谢谢

PHP中文网
PHP中文网

认证0级讲师

全員に返信(5)
PHPzhong

議長、ご招待ありがとうございます。
議長が言及した 2 つの方法はどちらも重複を防ぐための方法です。主な違いは、主キーまたは一意のインデックスの重複を効果的に解決できることです。重複を確認してから挿入するプログラムでは、これら 2 つの操作はアトミックではないため、クエリと挿入の間にリクエストが挿入されることを防ぐことはできず、重複のリスクが依然として存在します。

いいねを押す +0
Ty80

データベースが大量のリクエストを処理できる限り、データベースの一意のインデックスを使用できます。 Redis を使用して、アプリケーション層で一意性を判断することもできます。

いいねを押す +0
小葫芦

この質問の焦点はデータの重複排除ではなく、操作が失敗したというメッセージを受け取らなかったにもかかわらず、生徒がなぜ再試行を開始したかにあるように感じます。
各リクエストの処理時間を確認するには、インターセプターを使用してログを記録することをお勧めします。

いいねを押す +0
Ty80

呼び出し側は、次の操作を実行する前にリクエストの応答を待つ必要があります。たとえば、リクエストのタイムアウトを短く設定できます。

いいねを押す +0
巴扎黑

最も簡単で効果的な方法は、当面はパフォーマンスの問題を考慮せずに、一意のインデックスを構築することです。
実際にデータベースのボトルネックが発生した場合、アーキテクチャは現在のものではなくなると推定されます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート