我刚刚开始使用AppEngine,但是数据存储区存在一些问题。
我想使用JPA将一些数据写入数据存储区。我一直在关注来自Appengine网站的Java示例以及留言板示例,我想将此留言板示例翻译为使用JPA 2.0。
当我在我的输出中运行我的数据存储区中已有的一些数据(使用之前的运行创建)时,它会向我显示我在写入之前有7个项目,然后写入正常,之后再次给我7个项目。但是,如果我打开我的管理控制台(http:// localhost:8888 / _ah / admin / datastore?kind = Greeting),我可以看到数据存储区中已有8个项目。所以出于某种原因,我正在遭受幻读......
我的所有代码如下所示。
有没有人知道我做错了什么?
这就是我的persistence.xml的样子: http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd“version =”1.0“>
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
</properties>
</persistence-unit>
这是代码:
EntityManagerFactory emf = EMF.get();
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
// Reading the data
javax.persistence.Query query = em.createQuery("SELECT FROM Greeting g");
List<Greeting> greetings = query.getResultList();
for (Greeting g : greetings) {
log.info("Greeting found: " + g.getContent());
}
log.info("Number of greetings found before writing: " + greetings.size());
// Storing the data
Greeting greeting = new Greeting();
greeting.setUser(user);
greeting.setDate(new Date());
greeting.setContent(content);
em.persist(greeting);
em.flush();
// Reading the data
query = em.createQuery("SELECT FROM Greeting g");
greetings = query.getResultList();
for (Greeting g : greetings) {
log.info("Greeting found: " + g.getContent());
}
log.info("Number of greetings found after writing: " + greetings.size());
em.getTransaction().commit();
} catch (Exception e) {
log.warning("Cannot write to database because of error: " + e.getMessage());
e.printStackTrace();
} finally {
em.close();
emf.close();
}
答案 0 :(得分:0)
Google AppEngine不支持这种数据库一致性。它们不是在后台复制数据库,而是为每次写入而同时写入&gt; 50%的副本,稍后完成复制。因此,如果您编写,然后立即阅读,您的阅读可能会找到尚未复制的副本。
您只需更改代码即可避免写入后读取。通常这应该不是问题,因为它已经存在于内存中。
https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency
要在Eclipse中更改该设置,请转到Project&gt;右键单击&gt; Google&gt; AppEngine设置&gt;运行配置&gt; Web应用程序&gt;你的项目&gt; App Engine&gt;高复制设置(HRD)未应用的作业百分比&gt; 50.此值模拟在开发中写入后读取失败的次数。 0%=正常数据库(但在生产中会失败)。
JPA位于Datastore API之上,因此它遇到了同样的问题。