【问题标题】:Google App Engine & JDO: Transaction is not written to the datastoreGoogle App Engine 和 JDO:事务未写入数据存储区
【发布时间】:2013-04-29 22:41:47
【问题描述】:

我们在 JDO2.3 中使用 GAE 并且有这个代码:

public void submit_job (HttpSession session, BlobKey blobKey) throws Exception {
  // START TRANSACTION
  PersistenceManager pm = PMF.get().getPersistenceManager();
  Transaction tx = pm.currentTransaction();
  tx.begin();

  // GET JOB AND MEMBER FROM DATASTORE
  Key jobKey = (Key)session.getAttribute("jobkey");
  String userName = session.getAttribute("username").toString();

  Job job = pm.getObjectById(Job.class, jobKey);
  Member m = pm.getObjectById(Member.class, username);

  // STORE JOB INFORMATION IN DATASTORE
  Date now = new Date();
  job.caricature = blobKey;
  job.whenSubmitted = now;
  job.whenFinished = now;
  pm.makePersistent(job);
  pm.flush();
  log.warning("submit_job: updating job " + job.key);

  // UPDATE MEMBER INFORMATION
  m.numSubmittedJobs++;
  pm.makePersistent(m);
  pm.flush();    
  log.warning("submit_job: updating user " + username);

  // COMPLETE TRANSACTION
  tx.commit();
  pm.close();
  log.warning("transaction completed? " + !tx.isActive());
}

症状:

  • 没有抛出异常,一切正常
  • 最后,事务正确完成(“事务完成?真”)
  • 以下查询可以从 Member 和 Job 对象中读取更新的数据

但是

  • 信息未显示在数据存储管理器中
  • 重新启动实例后,JDO 对象具有其旧值。所有更改都将丢失。

这是我们的 jdoconfig.xml:

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

   <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"/>
       <property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>
   </persistence-manager-factory>
</jdoconfig>

和persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 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>
</persistence>

感谢任何帮助,我们已经为这个主题付出了很多努力,但还无法解决它。

谢谢!

【问题讨论】:

    标签: google-app-engine transactions google-cloud-datastore jdo


    【解决方案1】:

    因此,您正在设置可持久类的公共字段,并且以某种方式期望持久性机制知道这一点。根据 JDO 规范,您应该使用 setter,或者将进行设置的类注释为 PersistenceAware。

    还要查看日志,因为它会告诉您正在发生的事情

    【讨论】:

    • 是的,我当然希望在我明确调用 makePersist() 后立即存储更改。但是感谢您的提示,我会尝试一下:)
    • 谢谢伙计,我创建了@PersistenceAware 类,现在所有更改都已正确写入数据存储区。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 2010-11-25
    • 1970-01-01
    • 2012-06-22
    • 2012-02-18
    • 1970-01-01
    • 2011-02-16
    • 2013-12-03
    相关资源
    最近更新 更多