使用JDO从Datastore存储和检索数据

时间:2016-03-02 13:16:55

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

你能帮我解决这个问题吗?在这里,我使用AJAX调用将一些数据存储到带有JDO接口的数据存储区。我将数据存储到数据存储区并立即检索它。在检索一些时候,它返回NULL作为响应(它不总是返回NULL。只有一些时候它返回NULL)。能帮我解决这个问题吗?下面给出的代码用于存储和检索数据

此代码用于存储数据,

public void saveSchedule(String listName, String email, String date, String time, String details, String name)
{

        Date hiredate = new Date();
        String gmtdate = hiredate.toGMTString();
        Schedule schedule = new Schedule();
        schedule.setName(name);
        schedule.setListName(listName);
        schedule.setEmail(email);
        schedule.setDate(date);
        schedule.setDateGMT(gmtdate);
        schedule.setDetails(details);
        schedule.setTime(time);
        p = PMF.get().getPersistenceManager();
        try
        {
            p.makePersistent(schedule);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        finally
        {
            p.close();
        }
    }

此代码用于检索数据

public String savedDataRetrive(String details, String email) {

        p = PMF.get().getPersistenceManager();
        Query q = p.newQuery(Schedule.class);
        q.setFilter("details == '"+details+"' && email == '"+email+"'");    
        List<Schedule> sch = (List<Schedule>) q.execute();
        String data = null;
        ObjectMapper n=new ObjectMapper();
        try {
            data = n.writeValueAsString(sch);

        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            p.close();
        }
        return data;
    }

3 个答案:

答案 0 :(得分:1)

数据存储区跨多个数据中心复制数据。这为读取和写入提供了高水平的可用性,但是,大多数查询最终一致。

  

最终一致性是分布式中使用的一致性模型   计算以实现非正式保证的高可用性   如果没有对给定数据项进行新的更新,最终都是   访问该项目将返回上次更新的值。

这很有可能是您的查询有时不返回任何内容的原因。

我建议您浏览Structuring Data for Strong Consistency文章。

答案 1 :(得分:0)

这是一个有用的例子:

https://github.com/mattburns/OddPrints/blob/master/op-gae/src/com/oddprints/servlets/Edit.java#L89

@GET
@Path("/basic/sample")
@Produces(MediaType.TEXT_HTML)
public Viewable loadBasicSample(@Context HttpServletRequest req)
        throws FileUploadException, IOException, URISyntaxException {

    return viewSampleImage(req, Settings.SAMPLE_PHOTO_BLOB_KEY,
            Settings.SAMPLE_PHOTO_BLOB_SIZE, new URL(
                    "http://www.oddprints.com/images/sample.jpg"));

}

Viewable viewSampleImage(HttpServletRequest req, Settings blobKeySetting,
        Settings blobSizeSetting, URL image) throws MalformedURLException,
        IOException {
    String blobKeyString = ApplicationSetting.getSetting(blobKeySetting);
    if (blobKeyString == null) {

        InputStream imgStream = image.openStream();

        byte[] bytes = IOUtils.toByteArray(imgStream);

        BlobKey blobKey = ImageBlobStore.INSTANCE.writeImageData(bytes);
        blobKeyString = blobKey.getKeyString();
        ApplicationSetting.putSetting(blobKeySetting, blobKeyString);
        ApplicationSetting.putSetting(blobSizeSetting, "" + bytes.length);
    }
    String blobSize = ApplicationSetting.getSetting(blobSizeSetting);

    req.getSession().setAttribute("blobKeyString", blobKeyString);
    req.getSession().setAttribute("blobSize", blobSize);
    req.getSession().setAttribute("basicMode", Boolean.TRUE);

    return viewBasic(req);
}

答案 2 :(得分:0)

我建议使用memcache,这样获取速度会更快,并且返回IMO时会有更少的空对象。