2011-12-17 7 views
5

आज पहली बार मैं जीडब्ल्यूटी और जेडीओ का उपयोग कर रहा हूं। मैं इसे स्थानीय डीबग मोड में ग्रहण के साथ चला रहा हूं।ऐप-इंजन जेडीओ लगातार पढ़ने काम नहीं कर रहा है, शायद कैशिंग?

मैं निम्नलिखित काम करते हैं:

public Collection<MyObject> add(MyObject o) { 
PersistenceManager pm = PMF.get().getPersistenceManager(); 
try { 
    pm.makePersistent(o); 
    Query query = pm.newQuery(MyObject.class);// fetch all objects incl. o. But o only sometimes comes... 
List<MyObject> rs = (List<MyObject>) query.execute(); 
ArrayList<MyObject> list= new ArrayList<MyObject>(); 
for (MyObject r : rs) { 
    list.add(r); 
} 
return list; 
} finally { 
    pm.close(); 
} 
} 

मैं पहले ही अपनी jdoconfig.xml में <property name="datanucleus.appengine.datastoreReadConsistency" value="STRONG" /> निर्धारित किया है। क्या मुझे कॉन्फ़िगरेशन में कुछ अन्य लेनदेन सामान सेट करना है? क्या किसी को jdoconfig.xml काम कर रहा था? या कहीं और समस्या है? कुछ कैशिंग के बीच में?

संपादित करें: बातें मैं कोशिश की है:

  • स्थापना NontransactionalRead/लिखें झूठी
  • के लिए एक ही/एक अलग PersistenceManager हालांकि बुला PMF.get().getPersistenceManager() कई बार
  • का उपयोग करते हुए लेन-देन का उपयोग
  • ignoreCache = PersistenceManager
  • पर flush और 012 पर सही

jdoconfig:

<persistence-manager-factory name="transactions-optional"> 
<property name="datanucleus.appengine.datastoreReadConsistency" value="STRONG" /> 
    <property name="javax.jdo.PersistenceManagerFactoryClass" 
     value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/> 
    <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"/> 
</persistence-manager-factory> 

मैं कुछ केंद्रीय यहाँ क्योंकि सभी दृष्टिकोण असफल लापता जाना चाहिए ...

EDIT2: जब मैं दो लेनदेन में काम विभाजित लॉग कहते हैं कि लेखन लेनदेन खत्म हो गया और फिर पढ़ा गया लेनदेन शुरू होता है। लेकिन यह सिर्फ परिपक्व वस्तु नहीं मिलती है। यह हमेशा Level 1 Cache of type "weak" initialised कहता है। सप्ताह खराब है या अच्छा है?

यह लगभग 30% अनुरोध गलत है ... क्या मैं कुछ आलसी क्वेरी लोडिंग समस्या हो सकता हूं?

+1

मैं भी यही समस्या का सामना। मैं अपने ऐप के माध्यम से कुछ ऑब्जेक्ट्स जोड़ता हूं, लेकिन वे परिणाम में कभी-कभी प्रतिबिंबित नहीं होते हैं, कभी-कभी, और कभी-कभी वे करते हैं! –

+0

और ऑब्जेक्ट क्वेरी करने के समय डेटास्टोर में है? जाहिर है कि लॉग आपको बताएगा। जीडब्ल्यूटी के साथ इसका क्या संबंध है अस्पष्ट है ... – DataNucleus

+0

मुझे लॉग कहां मिल सकता है?जीडब्ल्यूटी के साथ क्या करना है? बहुत, क्योंकि यह एक जीडब्ल्यूटी परियोजना है। मैं वास्तव में जीडब्ल्यूटी और ऐप-इंजन के बीच एक स्पष्ट रेखा नहीं खींच सकता इसलिए मैं Google से आने वाली सभी चीज़ों को जीडब्ल्यूटी कहता हूं। और कैशिंग इतनी गड़बड़ क्यों हो जाएगी कि वही उदाहरण सिर्फ लिखे गए डेटा को भी पढ़ नहीं सकता? क्या आप एक jdoconfig.xml पोस्ट कर सकते हैं जो हमेशा एक ही ग्राहक के लिए सुसंगत रहेगा? –

उत्तर

2

फ्रांज, जेडीओ कॉन्फ़िगरेशन में डिफ़ॉल्ट पढ़ने की स्थिरता मजबूत है। इसलिए यदि आप उस दिशा में उससे संपर्क करने की कोशिश कर रहे हैं, तो यह आपको कहीं भी नेतृत्व नहीं करेगा

इसे जांचें क्योंकि मुझे लगता है कि यह आपके द्वारा सामना किए जा रहे परिदृश्य के समान कुछ बताता है, प्रतिबद्ध डेटा क्वेरी में वापस नहीं लौटाया जाता है। यह उल्लेख के अनुसार समवर्ती नहीं है, लेकिन यह प्रतिबद्ध प्रक्रिया बताता है।

http://code.google.com/appengine/articles/transaction_isolation.html

इसके अलावा, एक और दृष्टिकोण विस्तार का उपयोग कर क्वेरी और अगर है कि, विशेष रूप से उपयोग के मामले आप देख रहे हैं हल करती है के बाद से मेरा मानना ​​है आप तालिका में सभी रिकॉर्ड बाहर खींच रहे हैं पता लगाने के लिए किया जाएगा।

संपादित करें:

कोड में के बाद से झलकी है कि आप का उल्लेख किया है, यह पूरे तालिका क्वेरी करता। और अगर है कि तुम क्या जरूरत है, तो आप एक हद यह है उपयोग करने के लिए persistenceManager सिंगलटन वस्तु पर

Extent ext = getExtent(<Entity Class name>)

फोन करके उपयोग कर सकते हैं ... रास्ता। इसके बाद आप विस्तार

दस्तावेज देखें और यहां पृष्ठ पर विस्तारों की खोज करें। http://code.google.com/appengine/docs/java/datastore/jdo/queries.html

+0

ठीक है यह कहता है कि रिटर्न देने पर यह गारंटी नहीं दी जाती है कि परिवर्तन दिखाई दे रहे हैं (जो इस तरह की बेवकूफ अवधारणा का आविष्कार करेगा?)। अब सवाल यह है कि: मैं दृश्यता को कैसे मजबूर कर सकता हूं? या क्या मैं अपने कहां से कुछ चाल कर सकता हूं, क्योंकि आपने पूरी तालिका पूछने के बारे में कुछ कहा था? –

+1

विस्तारों के उपयोग के बारे में टिप्पणी अपडेट की गई। इसके अलावा, यहां जेडीओ में कैशिंग का स्पष्टीकरण है। यह उपयोग का हो सकता है। http://book.javanb.com/using-and-understanding-java-data-objects/LiB0046.html – Hrishikesh

+0

कक्षा का एक विस्तार और कक्षा की क्वेरी एक ही चीज़ है FWIW – DataNucleus

2

makePersistent() विधि को कॉल करना डेटास्टोर को नहीं लिखता है; PersistenceManager को बंद करना या आपके परिवर्तन करना। चूंकि आपने अपनी क्वेरी चलाने पर ऐसा नहीं किया है, इसलिए आपको डेटास्टोर से सभी ऑब्जेक्ट मिल रहे हैं, जो अभी तक उस ऑब्जेक्ट को शामिल नहीं करते हैं जिसे आपने मेकपर्सिस्टेंट कहा है। लेन-देन पर 5 लेन-देन/इकाई प्रकार सीमा http://db.apache.org/jdo/state_transition.html

इस के आसपास के दो तरीके हैं, तो आप एक सौदे के अंदर इस डाल सकते हैं के बाद से प्रतिबद्ध डेटासंग्रह को लिखते हैं (ध्यान में रखना GAE:

वस्तु राज्यों यहाँ के बारे में पढ़ें) और अपनी क्वेरी चलाने से पहले प्रतिबद्ध करें; उदाहरण लेन-देन का उपयोग कर ...

public Collection<MyObject> add(MyObject o) { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    ArrayList<MyObject> list = null; 
    try { 
     Transaction tx=pm.currentTransaction(); 
     try { 
      tx.begin(); 
      pm.makePersistent(o); 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 

     Query query = pm.newQuery(MyObject.class); 
     List<MyObject> rs = (List<MyObject>) query.execute(); 
     ArrayList<MyObject> list = new ArrayList<MyObject>(); 
     for (MyObject r : rs) { 
      list.add(r); 
     } 
    } finally { 
     pm.close(); 
    } 

    return list; 
} 

या आप ओ पर makePersistent बुला के बाद हठ प्रबंधक बंद करें और उसके पर आपकी क्वेरी को चलाने के लिए एक दूसरे से खोल सके।

// Note that this only works assuming the makePersistent call is successful 
public Collection<MyObject> add(MyObject o) { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    try { 
     pm.makePersistent(o); 
    } finally { 
     pm.close(); 
    } 

    pm = PMF.get().getPersistenceManager(); 
    ArrayList<MyObject> list = null; 
    try { 

     Query query = pm.newQuery(MyObject.class); 
     List<MyObject> rs = (List<MyObject>) query.execute(); 
     list= new ArrayList<MyObject>(); 
     for (MyObject r : rs) { 
      list.add(r); 
     } 

    } finally { 
     pm.close(); 
    } 

    return list; 
} 

नोट: मैं मूल रूप से आप सिर्फ लौटने से पहले परिणाम सूची में o जोड़ सकता है कहा; लेकिन यह तब से करना एक स्मार्ट बात नहीं है जब डेटास्टोर में o लिखने में कोई समस्या हो; तो लौटाई गई सूची डेटास्टोर में वास्तविक डेटा को प्रतिबिंबित नहीं करेगी।मेरे पास अब जो करना है (लेनदेन करना या दोपहर बंद करना और फिर एक और प्राप्त करना) काम करना चाहिए क्योंकि आपके पास डेटास्टोर रीडपालिसी सेट है।

+2

नहीं है, मैंने दोनों दृष्टिकोणों और लपेटने की कोशिश की और दो अलग-अलग में लिखने की कोशिश की लेन-देन। कभी-कभी यह काम करता है और कभी-कभी ऐसा नहीं होता है, यह गंभीरता से गड़बड़ हो जाता है। मैंने प्रोजेक्ट को साफ़ किया, जेडीके 6 में डाउनग्रेड किया गया, अब मैं विकल्पों में से बाहर हूं। मैं फ्लश और कॉन्स्टेंसी को भी कॉल करने के बाद चेक करता हूं, लेकिन यह सब मदद नहीं करता है। कभी-कभी डेटा डेटास्टोर में पर्याप्त तेज़ी से नहीं मिलता है। मैन्युअल रूप से परिणामों में नई वस्तु जोड़ने के साथ आपका पहला विचार। मैंने ऐसा किया, लेकिन फिर मुझे कभी-कभी समस्याएं एक अनुरोध मिलती हैं, क्योंकि वह मान अभी भी स्टोर में नहीं है। एक ब्राउजर रीफ्रेश तब चाल करता है (ज्यादातर?)। –

+0

क्या आप किसी भी प्रकार की कैशिंग कर रहे हैं; या तो किसी प्रकार के मानचित्र या मेमकेचे एपीआई के माध्यम से? – Dave

1

मुझे एक ही समस्या का सामना करना पड़ा और इससे मदद नहीं मिली। चूंकि यह Google पर "jdo ऐप इंजन स्थिरता" के लिए Google पर शीर्ष परिणाम प्रतीत होता है, मुझे लगा कि मैं अपने लिए फिक्स साझा करूंगा!

बाहर निकलता है मैं कई उदाहरणों का उपयोग कर रहा था PersistenceManagerFactory जिसके कारण कुछ विचित्र व्यवहार हुआ। फिक्स यह है कि एक सिंगलटन है कि कोड का हर टुकड़ा एक्सेस करता है। यह वास्तव में GAE ट्यूटोरियल्स पर documented correctly है लेकिन मुझे लगता है कि इसका महत्व कम हो गया है।

एक PersistenceManager उदाहरण

कोई एप्लिकेशन JDO PersistenceManager वर्ग का एक उदाहरण का उपयोग करते हुए साथ सूचना का आदान हो रही है। आपको यह उदाहरण तत्काल और पर एक विधि को तत्काल और PersistenceManagerFactory कक्षा का एक उदाहरण कॉल करके मिलता है। कारखाना PersistenceManager उदाहरण बनाने के लिए जेडीओ कॉन्फ़िगरेशन का उपयोग करता है।

क्योंकि एक पर्सिस्टेंस मैनेजर फैक्ट्री इंस्टेंस को प्रारंभ करने में समय लगता है, किसी ऐप को एक उदाहरण का पुन: उपयोग करना चाहिए। इस प्रकार PersistenceManagerFactory उदाहरण प्रबंधन करने के लिए एक आसान तरीका है, एक स्थिर उदाहरण के साथ एक सिंगलटन आवरण वर्ग बनाने के लिए है:

PMF.java

import javax.jdo.JDOHelper; 
import javax.jdo.PersistenceManagerFactory; 

    public final class PMF { 
     private static final PersistenceManagerFactory pmfInstance = 
      JDOHelper.getPersistenceManagerFactory("transactions-optional"); 

     private PMF() {} 

     public static PersistenceManagerFactory get() { 
      return pmfInstance; 
     } 
    } 
+0

हालांकि यह कई अन्य समस्याओं को हल करता है, इसने मूल पोस्टर (साथ ही साथ) के मुद्दों का समाधान नहीं किया। Devserver व्यवस्थापक इंटरफ़ेस भी डेटा परिवर्तनों को सही ढंग से प्रतिबिंबित नहीं करता है। अगर मैं सबकुछ छोड़ देता हूं तो थोड़ी देर के लिए बैठो, _ कभी-कभी मैं चीजों को जारी रखूंगा और उपलब्ध हो जाऊंगा। यह यादृच्छिक लगता है, हालांकि मुझे यकीन है कि कुछ और चल रहा है। –

संबंधित मुद्दे