2009-09-10 2 views
12

Java와 함께 Google AppEngine을 사용하고 있습니다.AppEngine 데이터 저장소 : "ID가 인 객체 ... 다른 객체 관리자가 관리합니다"

Object with id "[email protected]" is managed by a different Object Manager 

나는 이것이 의미 또는 어디에서 어떻게이 오류에 대한 문서를 찾아 그것을 해결하는 방법 모르는 : 나는 몇 가지 데이터 저장소 기능을 사용하면 오류 메시지가 표시 얻고있다. 누구든지 나를 도울 수 있습니까? 내가 사용하는 코드는 다음과 같습니다

@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; 
} 

나는 "private List<Teacher> Teachers;이"를 의미한다는 생각에 "소유 많은 한"관계.

답변

9

영구 객체는 하나의 PersistenceManager에 의해서만 "관리"될 수 있습니다. DataNucleus에서는 내부적으로 "ObjectManager"에 의해 지원됩니다. 메시지는 한 PM이 관리하는 오브젝트를 다른 PM과 연관 시키려고한다고합니다. 당신은 쉽게 메시지가 훨씬 더 말할 수없는, 어디에서 오는지 각 (지속) 개체에 대한

JDOHelper.getPersistenceManager(obj); 

을 PM을 인쇄하여 사용자가 정의하지 않기 때문에 것을 디버깅 할 수 있습니다. DataNucleus 로그 항목은 그 이상으로 길을 알려줍니다.

된 PM은 항상 (당신이 자원 누수를 원하지 않는다면)

+0

재미있는 설명. +1 – VonC

+0

PM 인스턴스에 적합한 수명이 더 무엇인지 나에게 설명 할 수 있습니까? 웹 앱을 작성한다고 가정 해 보겠습니다. 모든 페이지 요청시 열어야합니까? 또는 프로세스의 수명 동안 하나의 인스턴스를 열어 두어야합니까? (트랜잭션을 커밋하지만 PM을 닫지 않으면 메모리 누수가 발생하는 최악의 상황입니까? 내 데이터는 안전합니까?) –

+1

프로세스는 얼마나 오래 걸립니까? 일반적인 웹 시스템은 요청 당 PM을 사용합니다. PM 작성은 비용이 많이 들지 않습니다 (PMF 작성은 * 비쌉니다). txns를 사용하는 경우 해당 PM과 비 트랜잭션 업데이트를 수행하지 않는 한 안전하게 PM을 열어 둘 수 있습니다. – DataNucleus

3

this ticket에 나와 있듯이 오후 (PersistenceManager)를 닫지 않아야합니까?

} finally { 
    tx.commit(); 
    pm.close(); 
} 
+0

나는 원래 이것이 내 문제를 해결했다고 생각했지만, 그렇지 않았다. 처음에는 무엇이 계속되고 있는지 그리고 지속성 관리자를 닫는 것이 필요한지, 아니면 언제해야 하는지를 알지 못합니다. 둘째, AppEngine 문서는 PersistenceManager에서 싱글 톤 패턴을 사용하도록 권장하고 pm.close()는 나머지 프로세스 동안 Google 데이터 스토어를 사용하여 더 많은 작업을 수행 할 수 없다는 것을 의미합니다. –

+0

PM이 아닌 Singleton 패턴입니다. pm.close() * not * pmf.close() – DataNucleus

2

DataNucleus 할 필수적인 일이다 닫기

pm.close(); 팁 주셔서 감사합니다. 나는 하나 개 그들을

em = EMF.get().createEntityManager();

으로 쿼리를 만들고 첫 번째를 닫지 않고 다른 하나 커밋하고 있었다.

관련 문제