0

jdoデータストアトランザクションに関するGoogleのドキュメントでもどこでもチェックしましたが、何も見つかりませんでした。私の問題は、ArrayList を持つエンティティがあり、アイテムが失われたり、正しく保存されなかったりすることがあります。本番環境で一貫性がなく、データが失われているため、これは大きな問題です。

親エンティティ:

@PersistenceCapable
public class Account

@Order(extensions = @Extension(vendorName = "datanucleus", key = "list-ordering", value = "key ASC"))
private ArrayList<Match> matches = new ArrayList<Match>();

子供:

@PersistenceCapable
public class Match

@Persistent
private ArrayList<Long> players = new ArrayList<Long>();

これで、プレイヤーの配列リストを 15 分ごとに更新する cron タスクができました。

PersistenceManager manager = PMFactory.get().getPersistenceManager();
List<Account> accounts = <<obtain all accounts>>
for (Account account : accounts) {
 Transaction tx = manager.currentTransaction();
 tx.begin();
 List<Long> players = account.getMatches.getPlayers();
    <<add or remove elements - players.remove()/players.add()>>
 tx.commit();
}
manager.close();

コードは単なる要約です。私はすべてを試して/キャッチしてログに記録します。例外は発生せず、タスクは正常に終了します。ローカルでこのエラーを再現できません。私は約 300 のアカウントを持っており、それぞれにおそらく 10 件の一致があります。試合に出場できる選手は 20 人以下です。選手リストが正しく更新されないことがあります...または一部の要素が失われることさえあります。ほとんどの場合、それは機能します。たぶん、2番目または3番目のインスタンスが生き返ったとき?? Persistence Manager を閉じて、アカウントごとに新しいものを取得する必要がありますか? jdo 2.3を使用しています。このアプリを 4 年間使用してきましたが、より多くのアカウントを開設した今、この問題が発生しています。絶望してください!:-( よろしくお願いします!

jdoconfig.xml

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

persistence.xml

<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>
4

1 に答える 1

0

私はそれを機能させる方法を見つけました。どの行がそれを機能させているのか、それとも全体なのかは正確にはわかりません:

PersistenceManager manager = PMFactory.get().getPersistenceManager();// get instance of PM
List<Account> keys = <<obtain all accounts KEYS>> //get only KEYS(before I was getting all accounts and not by their keys)
manager.close(); // close PM

for (Key key : keys) {
  manager = PMFactory.get().getPersistenceManager();// get instance of PM for each account:  Is this necessary?? should I use the same PM as before?? 
  Account account = dao.getAccount(key);
  List<Long> players = account.getMatches.getPlayers();
    <<add elements(players.add()) or do nothing depending on business logic>>               
  manager.flush(); //flush: is this necessary??
  manager.close(); // close PM for each account
}

このコードは機能しているようです。それが機能するのは、すべてのアカウントのPMを閉じて開くか、キーを取得してからキーで各アカウントを取得するか、PMを閉じる​​前にフラッシュするかどうかはわかりません。このエラーは PRODUCTION でしか再現できないため、何が機能し、何が不要かをテストすることはできません。このコードが機能することはわかっています。

于 2015-11-09T15:15:35.647 に答える