से असंगत प्राप्त करें मेरे पास Google ऐप इंजन में एक एप्लिकेशन तैनात है। जब मैं उस इकाई को अद्यतन करने के तुरंत बाद आईडी द्वारा एक इकाई प्राप्त करता हूं तो मुझे असंगत डेटा मिल रहा है। मैं ऐप इंजन डेटास्टोर तक पहुंचने के लिए जेडीओ 3.0 का उपयोग कर रहा हूं।Google App Engine डेटास्टोर
मैं शुरू में एक इकाई के कर्मचारी
@PersistenceCapable(detachable = "true")
public class Employee implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8319851654750418424L;
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY, defaultFetchGroup = "true")
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String id;
@Persistent(defaultFetchGroup = "true")
private String name;
@Persistent(defaultFetchGroup = "true")
private String designation;
@Persistent(defaultFetchGroup = "true")
private Date dateOfJoin;
@Persistent(defaultFetchGroup = "true")
private String email;
@Persistent(defaultFetchGroup = "true")
private Integer age;
@Persistent(defaultFetchGroup = "true")
private Double salary;
@Persistent(defaultFetchGroup = "true")
private HashMap<String, String> experience;
@Persistent(defaultFetchGroup = "true")
private List<Address> address;
/**
* Setters and getters, toString() * */
}
है, जब मैं एक कर्मचारी बनाने मैं क्षेत्रों वेतन और ईमेल सेट न करें।
मैं बाद में वेतन और ईमेल जोड़ने के लिए कर्मचारी इकाई को अद्यतन करता हूं। अद्यतन ठीक काम करता है और डेटा एपेंगेन डेटास्टोर में जारी रहता है। हालांकि, जब मैं तुरंत आईडी द्वारा एक ही कर्मचारी इकाई लाने की कोशिश करता हूं, तो मुझे कभी-कभी पुराना डेटा मिलता है, जहां वेतन और ईमेल शून्य होते हैं। कोड इकाई को बनाने और लाने के लिए मैं जिस कोड का उपयोग करता हूं वह नीचे दिया गया है।
public Employee create(Employee object) {
Employee persObj = null;
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = null;
try {
tx = pm.currentTransaction();
tx.begin();
persObj = pm.makePersistent(object);
tx.commit();
} finally {
if ((tx != null) && tx.isActive()) {
tx.rollback();
}
pm.close();
}
return persObj;
}
public Employee findById(Serializable id) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Employee e = pm.getObjectById(Employee.class, id);
System.out.println("INSIDE EMPLOYEE DAO : " + e.toString());
return e;
} finally {
pm.close();
}
}
public void update(Employee object) {
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = null;
try {
tx = pm.currentTransaction();
tx.begin();
Employee e = pm.getObjectById(object.getClass(), object.getId());
e.setName(object.getName());
e.setDesignation(object.getDesignation());
e.setDateOfJoin(object.getDateOfJoin());
e.setEmail(object.getEmail());
e.setAge(object.getAge());
e.setSalary(object.getSalary());
tx.commit();
} finally {
if (tx != null && tx.isActive()) {
tx.rollback();
}
pm.close();
}
}
मैं 5 से निष्क्रिय उदाहरणों की संख्या निर्धारित किया है और 8 एक समय में चल रही चारों ओर देखते हैं। जब मैंने विभिन्न उदाहरणों के लॉग की जांच की तो मुझे यही मिला।
कुछ उदाहरणों से अनुरोध कब किया जाता है जब मुझे पुराना डेटा क्यों मिलता है। मैं यह आश्वस्त कर सकता हूं कि, अगर अनुरोध अनुरोध को प्रारंभिक रूप से अद्यतन अनुरोध को संभाला जाता है तो मुझे हमेशा अद्यतन डेटा मिलता है। लेकिन जब अन्य उदाहरण प्राप्त करने के अनुरोध को संभालते हैं तो पुराना डेटा वापस किया जा सकता है। मैंने अपने jdoconfig.xml में मजबूत करने के लिए डेटास्टोर पढ़ने की स्थिरता स्पष्ट रूप से सेट की है।
<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd">
<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.singletonPMFForName" value="true"/>
<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>
<property name="datanucleus.query.jdoql.allowAll" value="true"/>
<property name="datanucleus.appengine.datastoreReadConsistency" value="STRONG" />
</persistence-manager-factory>
</jdoconfig>
http://stackoverflow.com/search?q=%5Bgae%5D+eventual+consistency "अंतिम स्थिरता" में दिखता है जैसा कि ऐसा लगता है। –
@ पॉलकॉलिंगवुड मैंने स्टैटोंग को डेटास्टोर पढ़ने की स्थिरता निर्धारित की है। –
HariShankar
http://stackoverflow.com/questions/8112331/google-app-engine-jdo-makepersistent-latency – arundevma