2012-12-01 3 views
2

방금 ​​AppEngine을 시작했지만 데이터 스토어에 문제가 있습니다.Appengine 및 JPA - 방금 작성된 데이터 읽기

JPA를 사용하여 일부 데이터를 데이터 저장소에 쓰고 싶습니다. Appengine 웹 사이트의 Java 예제를 방명록 예제와 함께 사용하여이 방명록 예제를 JPA 2.0을 사용하여 번역하고 싶습니다.

내 데이터 저장소 (이전 실행을 사용하여 생성 한)에서 이미 사용할 수있는 일부 데이터로 응용 프로그램을 실행할 때 작성하기 전에 7 개 항목이 표시되고 쓰기가 정상인 것으로 나타납니다. 나중에 다시 7 개 항목 제공 . 하지만 내 admin-console (http : // localhost : 8888/_ah/admin/datastore? kind = Greeting)을 열면 데이터 저장소에 이미 8 개의 항목이 있음을 알 수 있습니다. 그래서 어떤 이유로 저는 팬텀을 읽는 중입니다 ...

내 모든 코드는 아래에 나와 있습니다.

내가 뭘 잘못하고 있는지 생각하는 사람이 있습니까?

이 내 persistence.xml을 보이는 방법입니다 같은 : http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd "버전 ="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> 

그리고 이것은 코드입니다 : w 모든 들어

 EntityManagerFactory emf = EMF.get(); 
     EntityManager em = emf.createEntityManager(); 
     try { 
      em.getTransaction().begin(); 

      // Reading the data 
      javax.persistence.Query query = em.createQuery("SELECT FROM Greeting g"); 
      List<Greeting> greetings = query.getResultList(); 
      for (Greeting g : greetings) { 
       log.info("Greeting found: " + g.getContent()); 
      } 
      log.info("Number of greetings found before writing: " + greetings.size()); 

      // Storing the data 
      Greeting greeting = new Greeting(); 
      greeting.setUser(user); 
      greeting.setDate(new Date()); 
      greeting.setContent(content); 

      em.persist(greeting); 
      em.flush(); 

      // Reading the data 
      query = em.createQuery("SELECT FROM Greeting g"); 
      greetings = query.getResultList(); 
      for (Greeting g : greetings) { 
       log.info("Greeting found: " + g.getContent()); 
      } 
      log.info("Number of greetings found after writing: " + greetings.size()); 
      em.getTransaction().commit(); 
     } catch (Exception e) { 
      log.warning("Cannot write to database because of error: " + e.getMessage()); 
      e.printStackTrace(); 
     } finally { 
      em.close(); 
      emf.close(); 
     } 

답변

0

구글 AppEngine에 데이터베이스 일관성의 종류를 지원하지 않는 대신 백그라운드에서 DB를 복제. 그러나 동시에 복사본의 50 % 이상을 쓰고 나중에 복제를 마칩니다. 따라서 작성한 후 즉시 읽으면 읽지 않은 복사본이 아직 복제되지 않은 것일 수 있습니다.

쓰기 후에 읽지 않으려면 코드를 변경하기 만하면됩니다. 일반적으로 이것은 메모리에 이미 있기 때문에 문제가되지 않습니다.

https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

이 프로젝트로 이동, 이클립스에서 해당 설정을 변경하려면> 마우스 오른쪽 클릭> 구글> AppEngine에 설정> 실행 구성> 웹 응용 프로그램> 프로젝트> 앱 엔진> 높은 복제 설정 (HRD) 적용되지 않은 작업 비율> 50.이 값은 개발에서 쓰기 후에 읽기가 실패하는 시간의 %를 에뮬레이션합니다. 0 % = 일반 데이터베이스 (하지만 프로덕션에서는 실패합니다).

JPA는 Datastore API 상단에 위치하므로 동일한 문제가 발생합니다.

관련 문제