4

私のサーブレットは次のことを実行する必要があります。ユーザーが会場に登録するときに、現在どこかに登録されているかどうかを確認します(同じ会場であっても)。登録されている場合は、登録を解除してもう一度登録します。

私は次のコードを持っていますが、問題を示すために簡略化しています:

    Date tempDate = new Date();


    Visit v = ofy().load().type(Visit.class)
            .filter(Visit.USER_ID, 5L)
            .filter(Visit.EXIT_DATE, null).first().get();

    if(v != null)
        exitVenue(5L, 7L, tempDate);

    Visit visit = new Visit(5L, 7L, tempDate);      
    ofy().save().entity(visit).now();

    Date tempDate2 = new Date();


    Visit v2 = ofy().load().type(Visit.class)
            .filter(Visit.USER_ID, 5L)
            .filter(Visit.EXIT_DATE, null).first().get();

    if(v2 != null)
        exitVenue(5L, 7L, tempDate2);

    Visit visit2 = new Visit(5L, 7L, tempDate2);        
    ofy().save().entity(visit2).now();
}


public void exitVenue(Long userID, Long venueID, Date exitDate) {

    Visit visit = ofy().load().type(Visit.class)
            .filter(Visit.USER_ID, userID)
            .filter(Visit.VENUE_ID, venueID)
            .filter(Visit.EXIT_DATE, null).first().get();

    if(visit == null){
        log.info("ERROR : User " + userID + " exited venue " + venueID + ", but Visit was not found");
        return;
    }
    visit.setExitDate(exitDate);

    ofy().save().entity(visit).now();
}

問題は、このすべての操作を2回実行したときに、データストアに既にアクセスがあることが常に検出されるとは限らないことです(2回ごとのテストなど)。そして、私は混乱しています。「now()」はすぐにそれを保存し、それから実行を継続することを想定していませんか?

ダン、助けてくれてありがとう

4

1 に答える 1

13

これは、GAEデータストアが結果整合性があるために発生します。エンティティを作成/更新すると、メソッドはすぐに返されますが、インデックスは引き続き非同期で作成されます。クエリはインデックスに依存しているため、変更がすぐに表示されることはありません。

また、これはobjectifyとは何の関係もありません。これは基盤となるデータストアのプロパティです。同期書き込み( )はコミットフェーズ.now()が終了するのを待ちますが、非同期はその直前でも戻ります。

于 2012-12-22T13:32:40.163 に答える