GAE JDO Query иногда возвращается с отсутствующими новейшими сохраненными сущностями - PullRequest
3 голосов
/ 19 августа 2011

Я пытаюсь создать простое приложение, используя google app engine, с java и JDO.

мое приложение создает объекты Sale и сохраняет их в хранилище данных, после сохранения я пытаюсь составить список, используя запрос, ВСЕ Продажи в хранилище данных.

однако иногда в списке отсутствует одна или две из последних сохраненных продаж, обновление браузера несколько раз в конечном итоге приведет к появлению всех продаж в списке.

даже когда я нажимаю кнопку «Добавить продажу» очень медленно (каждые 3 секунды или около того), все равно нет гарантии, что ВСЕ сохраненные продажи будут получены из запроса.

должен быть способ обеспечить, чтобы запрос возвратил ВСЕ продажи, я пытался использовать транзакции и не повезло, однако, возможно, я использовал его неправильно, любой совет будет оценен.

Вот мой объект продажи:

import java.util.Date;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;

@PersistenceCapable(detachable="true")
public class Sale {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private String title;

    @Persistent
    private Date valuationDate;

    public Sale(){

    }

    //getters and setters

Это мой служебный класс:

public class SaleUtil {

    public static void addSale(){
        PersistenceManager pm = PMF.get().getPersistenceManager();

        Sale s = new Sale();
        s.setTitle("new sale");
        s.setValuationDate(new Date());

        try{
            pm.makePersistent(s);
        } catch (Exception e){
            System.out.println(e);
        } finally {
            pm.close();
        }
    }

    public static List<Sale> getSales(){
        List<Sale> sales = new ArrayList<Sale>();
        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query query = pm.newQuery(Sale.class);
        query.setOrdering("valuationDate desc");
        try{
            List<Sale> results = (List<Sale>)query.execute();
            if(!results.isEmpty()){
                for(Sale s: results){
                    Sale detached = pm.detachCopy(s);
                    sales.add(detached);
                }
            }
        } catch (Exception e){
            System.out.println(e);
        } finally {
            query.closeAll();
            pm.close();
        }
        return sales;
    }

}

Это моя домашняя страница:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.List" %>
<%@ page import="javax.jdo.PersistenceManager" %>
<%@ page import="javax.jdo.Query" %>
<%@ page import="com.grc.tradesharx.*" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form action="/tradesharx" method="post">
        <input type="submit" value="add sale"/>
    </form>
    <%
        List<Sale> sales = SaleUtil.getSales();
        out.println(sales.size()+"<br/>");
        for(Sale s : sales){
            out.println(s+"<br/>");
        }
    %>
</body>
</html>

а это мой сервлет:

package com.grc.tradesharx;

import java.io.IOException;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class TradeSharxServlet extends HttpServlet {
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws     IOException {
        SaleUtil.addSale();
        resp.sendRedirect("index.jsp");
    }
}

пожалуйста, помогите мне, я знаю, что что-то упустил.

1 Ответ

1 голос
/ 19 августа 2011

Если вы используете хранилище данных с высокой репликацией (HRD), запросы вне групп объектов в конечном итоге непротиворечивы. Это означает, что может пройти некоторое время, прежде чем новые объекты будут реплицированы и возвращены в обычном запросе без предков.

Решение для вас состоит в том, чтобы использовать группы объектов / запросы предков для данных, которые должны быть согласованными.

... в хранилище данных с высокой репликацией запросы к сущности группы (другими словами, запросы не предков) могут возвращать устаревшие Результаты. Чтобы вернуть строго согласованные результаты запроса в Среда с высокой репликацией, вам нужно делать запросы по одному объекту группа. Этот тип запроса называется запросом предка.

Запросы предков работают, потому что группы сущностей являются единицей согласованности: все операции применяются ко всей группе. Запросы предков не будут возвращать данные до тех пор, пока не будет обновлена ​​вся группа объектов. Таким образом данные, возвращаемые из запросов предков по группам сущностей, сильно последовательны.

http://code.google.com/intl/sv-SE/appengine/docs/java/datastore/hr/overview.html

...