【问题标题】:GAE JDO Query sometimes returns with newest persisted entities missingGAE JDO 查询有时会返回缺少最新的持久实体
【发布时间】:2011-10-30 09:00:08
【问题描述】:

我正在尝试使用 google 应用引擎、java 和 JDO 构建一个简单的应用程序。

我的应用程序创建销售对象并将它们持久化到数据存储区,一旦持久化,我尝试使用查询列出数据存储区中的所有销售。

但有时列表会丢失最后一个或两个持久销售,刷新浏览器几次最终会列出所有销售。

即使我非常缓慢地单击“添加销售”按钮(每 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>

这是我的 servlet:

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");
    }
}

请帮帮我,我知道我错过了什么。

【问题讨论】:

    标签: google-app-engine jdo jdoql


    【解决方案1】:

    如果您使用的是高复制数据存储 (HRD),实体组之外的查询最终是一致的。这意味着在常规的非祖先查询中复制和返回新对象可能需要一些时间。

    您的解决方案是使用实体组/祖先查询来获取您需要保持一致的数据。

    ... 在 High Replication 数据存储中,跨实体查询 组(换句话说,非祖先查询)可能会返回陈旧的 结果。为了返回强一致的查询结果 高复制环境,需要查询单个实体 团体。这种类型的查询称为祖先查询。

    祖先查询之所以有效,是因为实体组是一个一致性单元: 所有操作都应用于整个组。祖先查询不会 返回数据,直到整个实体组都是最新的。就这样 从对实体组的祖先查询返回的数据是强 一致。

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

    【讨论】:

    • 感谢您为我指明了正确的方向。我正在使用 eclipse 构建我的应用程序,有什么方法可以确定本地数据存储是使用 HRD 还是 Master/Slave?
    • 默认情况下它像主/从一样工作,但您可以模拟 HRD。 code.google.com/intl/sv-SE/appengine/docs/java/tools/… "您可以配置本地数据存储以模拟 High Replication Datastore 的一致性模型。这将使您了解配置为使用 High Replication Datastore 的应用程序将如何在生产中运行。"
    • 我的默认设置如何设置为高复制 - 未应用的作业百分比:50 我认为这意味着我的提交有一半时间不会被应用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2011-11-30
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多