Google App Engine:JDO deletePersistent不一致

时间:2013-10-01 09:41:47

标签: google-app-engine jdo

我正在使用JDO(3.x,带有datanucleus 2)来保存谷歌应用引擎(java)中我的一个应用中的对象。我的调用顺序如下:

  1. 在servlet过滤器(servlet 1)中打开持久性管理器 - 使用ThreadLocal

  2. 从DAO类调用pm.findByObjectId(通过servlet 1)

  3. 从DAO类调用pm.deletePersistent(通过servlet 1)

  4. 调用pm.newQuery列出db中的所有对象(通过servlet 1) - 写入响应(json)

  5. 关闭servlet过滤器中的持久性管理器 - 最后是doFilter方法

  6. 然而,在我关闭第5步中的pm之前,我的对象不会被删除。此外它不是有意义的,有时它会被删除!(没有想到什么时候)。理想情况下,我希望在上面的步骤3中删除对象,以便在步骤4中运行查询时,它会返回更新的列表。

    任何人都可以让我知道,如果我可以改进这个设计,以原子方式插入/删除这个。或者只是因为对数据库的写入太慢了?

    这是我的jdoconfig.xml

    <persistence-manager-factory name="transactions-optional"> <property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/> <property name="javax.jdo.option.ConnectionURL" value="appengine"/> <property name="javax.jdo.option.NontransactionalRead" value="true"/> <property name="javax.jdo.option.NontransactionalWrite" value="true"/> <property name="javax.jdo.option.RetainValues" value="true"/> <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/> <property name="datanucleus.appengine.singletonPMFForName" value="true"/> </persistence-manager-factory>

1 个答案:

答案 0 :(得分:0)

我怀疑您的GAE环境设置为关闭时提交。您可以使用JDO API控制事务边界,例如:

Transaction jdoTx = pm.currentTransaction();
jdoTx.begin();
pm.deletePersistent(obj);
jdoTx.commit();