我正在使用JDO(3.x,带有datanucleus 2)来保存谷歌应用引擎(java)中我的一个应用中的对象。我的调用顺序如下:
在servlet过滤器(servlet 1)中打开持久性管理器 - 使用ThreadLocal
从DAO类调用pm.findByObjectId(通过servlet 1)
从DAO类调用pm.deletePersistent(通过servlet 1)
调用pm.newQuery列出db中的所有对象(通过servlet 1) - 写入响应(json)
关闭servlet过滤器中的持久性管理器 - 最后是doFilter方法
然而,在我关闭第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>
答案 0 :(得分:0)
我怀疑您的GAE环境设置为关闭时提交。您可以使用JDO API控制事务边界,例如:
Transaction jdoTx = pm.currentTransaction();
jdoTx.begin();
pm.deletePersistent(obj);
jdoTx.commit();