J'utilise le Google Appengine, avec Java. Lorsque j'utilise des fonctionnalités de DataStore, je reçois un message d'erreur:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class School {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String shortname;
@Persistent
private String fullname;
@Persistent
@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="code asc"))
private List<Teacher> Teachers;
...
public Teacher FindOrCreateTeacher(String code)
{
// Can we find the teacher without any database code?
Teacher newTeacher = FindTeacher(code);
if (newTeacher != null)
return newTeacher;
// Create the teacher:
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
for (Teacher teacher : Teachers) {
if (teacher.getCode() == code) {
tx.rollback();
return teacher;
}
}
newTeacher = new Teacher(code);
Teachers.add(newTeacher);
pm.makePersistent(newTeacher);
pm.makePersistent(Teachers);
tx.commit();
} finally {
tx.commit();
}
return newTeacher;
}
3 Réponses :
Comme illustré dans Ce billet , ne devriez-vous pas fermer Le PM ( persistenceManager code>)? } finally {
tx.commit();
pm.close();
}
Je pensais à l'origine que cela avait résolu mon problème, mais ce n'est pas le cas. Pour commencer, je ne sais toujours pas ce qui se passe et pourquoi la fermeture du gestionnaire de persistance est nécessaire, ou quand cela devrait être fait. Deuxièmement, la documentation appengine encourage l'utilisation d'un schéma de singleton avec le PersistenceManager, et le pm.close () signifierait que vous ne pouvez rien faire de plus avec le DataStore Google pour le reste du processus.
Modèle singleton avec le PMF, pas le PM. pm.close () pas i> pmf.close ()
Un objet persistant ne peut être "géré" que par un persistenceManager. Dans Datanucleveus, cela est soutenu en interne par un "objetManager". Le message dit que vous essayez d'associer un objet géré par un PM avec un PM différent. Vous pouvez facilement déboguer que, en imprimant le PM pour chaque objet (persistant) puisque vous ne définissez pas où le message provient, pas beaucoup plus peut être dit. Les entrées de journal du Datanuclevée vous indiqueraient beaucoup plus que cela. P> La fermeture du PM est toujours une chose essentielle à faire (sauf si vous ne voulez que des fuites de ressources) p> p> P>
Pouvez-vous expliquer davantage à moi quelle est une durée de vie appropriée pour une instance PM? Supposons que j'écris une application Web. Devrais-je ouvrir et fermer sur chaque demande de page? Ou garder une instance ouverte pour la durée de vie du processus? (Si je commis une transaction mais ne fermez pas le PM, cela signifie-t-il que le pire qui se passe est une fuite de mémoire? Je veux dire, mes données sont en sécurité?)
Combien de temps dure le processus? Un système Web typique utiliserait une PM par demande. La création d'un PM n'est pas chère (la création d'un PMF est i> cher). Si vous utilisez des txns, vous pouvez laisser un PM en toute sécurité ... Tant que vous n'effectuez pas de mises à jour non transactionnelles également avec ce PM.
Datanuclevéus, P>
Merci pour le et faire un commettre avec un autre sans fermer le premier. p> pm.close (); code> Conseil.
Je faisais une requête avec un em p>
em = emf.get (). CreatetentiyManager (); code> p>
blockQuote>