【问题标题】:Custom Iterator in Datastore shows zero using JAVADatastore 中的自定义迭代器使用 JAVA 显示为零
【发布时间】:2014-12-08 07:00:24
【问题描述】:

我使用我的数据存储实体来存储一个 int 值 number=0。在添加函数中,我使用了 count = number++。但是第一次将应用推送到 GAE,它显示 0。然后它从 1 开始。所以我更改为 int number =10,即使我得到的值为 0,但数据存储存储为 10。如何在 java 页面中获取更新的值插入记录后?当我尝试获取 current 值时,它显示为零,但在数据存储中它存储为 10。请帮我解决这个问题。如何获得价值 10。这只发生在第一次部署和第一次票证时,它才会显示正确的值(迭代器值)

谢谢

这是我的代码

@Entity
public class Ticket {

    //static int nextID = 17;

      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      private String title;  
      private Text description;
      static int nextID = 10;
      private int current;


      public Ticket(String title, Text description) {
            current = nextID++;
            this.title = title;
            this.priority = priority;
            this.description = description;
}

【问题讨论】:

    标签: java google-app-engine google-cloud-platform google-cloud-datastore


    【解决方案1】:

    Google Cloud Platform 有多个数据中心,它们并不总是保持相同记录的相同状态。如果您在增加该值后立即查询该值,则尤其如此。您可以使用祖先查询来检索实体,这将使其保持最新和一致。详情请看文章[1]。

    这是祖先查询 [2] 的链接。这个想法是,当您使用祖先查询时,它会强制查询在所有更改完成后返回数据(对于该查询)。这确保了最新的强一致性。

    [1] - https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/

    [2] - https://cloud.google.com/appengine/docs/java/datastore/queries#Java_Ancestor_queries

    ===---=== 示例(来自我提供的第二个链接)

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    
    Entity tom = new Entity("Person", "Tom");
    Key tomKey = tom.getKey();
    datastore.put(tom);
    
    
    Entity weddingPhoto = new Entity("Photo", tomKey);
    weddingPhoto.setProperty("imageURL",
                             "http://domain.com/some/path/to/wedding_photo.jpg");
    
    Entity babyPhoto = new Entity("Photo", tomKey);
    babyPhoto.setProperty("imageURL",
                          "http://domain.com/some/path/to/baby_photo.jpg");
    
    Entity dancePhoto = new Entity("Photo", tomKey);
    dancePhoto.setProperty("imageURL",
                           "http://domain.com/some/path/to/dance_photo.jpg");
    
    Entity campingPhoto = new Entity("Photo");
    campingPhoto.setProperty("imageURL",
                             "http://domain.com/some/path/to/camping_photo.jpg");
    
    List<Entity> photoList = Arrays.asList(weddingPhoto, babyPhoto,
                                           dancePhoto, campingPhoto);
    datastore.put(photoList);
    
    
    Query photoQuery = new Query("Photo")
                             .setAncestor(tomKey);  
    
    
    // This returns weddingPhoto, babyPhoto, and dancePhoto,
    // but not campingPhoto, because tom is not an ancestor
    List<Entity> results = datastore.prepare(photoQuery)
                                    .asList(FetchOptions.Builder.withDefaults());
    

    ===---=== 请参阅以下部分:

    实体婚礼照片 = new Entity("照片", tomKey);

    Entity dancePhoto = new Entity("Photo", tomKey);

    这会生成一个带有祖先键“tomKey”的实体。

    现在将实体保存到数据存储中:

    List<Entity> photoList = Arrays.asList(weddingPhoto, babyPhoto,
                                               dancePhoto, campingPhoto);
    datastore.put(photoList);
    

    当你需要获取结果时,执行一个特殊的查询:

    Query photoQuery = new Query("Photo")
                                 .setAncestor(tomKey); 
    

    这确保 photoQuery 不仅仅是针对任何随机数据中心提取任何数据的随机查询;它确保从数据存储中获取最新数据。

    【讨论】:

    • 我是使用 java 的 GAE 新手。我无法理解祖先查询。请举例说明。我正在使用 DAO 和 javax.persistence.Query。使用这个举个例子
    • 请使用数据存储查询方法进行祖先查询(如示例所示)。这个想法是,当您向实体提供祖先键,然后使用祖先键查询它时。它将返回实体的最新版本。
    • 好的,谢谢你的例子。我不问主键。我要创建自定义迭代器。对自定义迭代器有帮助吗?
    • 好的,您最初的问题是您的自定义迭代器不时有过时的数据,对吧?原因是当您查询迭代器(添加到它)时,有时会发现过时的版本。因此,使用 Ancestor Query,您可以确保获得已保存迭代器的更新版本。示例:如果 x=0, x++, fetch x 会给你 x=1 如果你使用祖先查询获取它,如果你使用普通查询获取它,它仍然可能是 x=0。
    • 哇超级解释。现在只有我得到知识,谢谢。我已经使用 javax.persistence.Query。我现在可以使用吗?或者我可以改变我的项目吗?
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2013-02-17
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多