1

私はテーブルを持っています、フー。特定のイベントでこのテーブルに行を追加します。現在の全体的な設計では、メッセージの重複は避けられません。これにより、重複する行がテーブルに追加されます。

このテーブルの行になるさまざまな種類のメッセージがあるため、テーブルに一意の制約を設定できません。特定の種類のメッセージのみ重複を避けたい。

重複したメッセージが同時に送信されることが多く、そのアプリケーションは複数のノードで実行されるため、radisson を使用して分散ロックを取得することにしました。ただし、機能していないようです。私はまだテーブルに重複した行を取得しています。

重複メッセージは、userId、日付、およびタイプに基づいて検出されます。以下は最小限のデモコードです。書き込みの前に読み取りを実行しようとしていますが、この読み取りはアプリケーション ノード間で同期されたブロックで行われています。

これに関するご意見をお待ちしております。

     if(updateEntry.getType().equals(Type.XYZ) {
       java.sql.Date date = updateEntry.getDate();
       String redisLockKey = "MyAPP" + "-" + userId+"-"+date.toString()+ "-" + "type-XYZ";
       RLock rLock =    redissonClient.getLock(redisLockKey);
       rLock.lock(5, TimeUnit.SECONDS);
       MyEntity myEntity = myEntityRepository.findByUserIdAndDateAndActivityType(userId,date,Type.XYZ);
       if(null == myEntity) {
           myEntity = new MyEntity();
           // myEntity setters
        myEntity = myEntityRepository.saveAndFlush(myEntity);
       }
       rLock.unlock();
     }
4

2 に答える 2

0
MyEntity myEntity = myEntityRepository.findByUserIdAndDateAndActivityType(userId,date,Type.XYZ);
if(null == myEntity) {
   myEntity = new MyEntity();
   // myEntity setters
   myEntity = myEntityRepository.saveAndFlush(myEntity);
}

コードのこの部分によると、このレコードを挿入できるかどうかを判断するための一意の条件として、userId、date、および type を扱っています。では、一意の制約を組み合わせて 3 つをまとめて作成できない理由を説明できますか。

于 2017-06-21T18:58:44.457 に答える