【问题标题】:Google App Engine : JDO deletePersistent not consistentGoogle App Engine:JDO deletePersistent 不一致
【发布时间】:2013-10-01 09:41:46
【问题描述】:

我正在使用 JDO(3.x,带有 datanucleus 2)在我的 google 应用引擎 (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 方法的 finally 内

但是,直到我在步骤 5 中关闭 pm 之前,我的对象才会被删除。而且它也不是 consitent,有时它确实会被删除!(还没有弄清楚什么时候)。理想情况下,我希望在上面的第 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>

【问题讨论】:

    标签: google-app-engine jdo


    【解决方案1】:

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

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

    【讨论】:

    • 我可以在某个地方配置它,这样我就不必在任何地方开始/提交事情了吗?我已经在原始问题中发布了我上面的 jdoconfig
    • 语句被缓冲到 pm close 的事实表明 GAE 为您设置了事务上下文,所以我不确定您如何覆盖它以自动提交...检查您的GAE 配置。您可能还想尝试重置 datanucleus.nontx.atomic=true。
    猜你喜欢
    • 2011-01-28
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多