Tôi có một ứng dụng được triển khai trong công cụ ứng dụng của Google. Tôi nhận được dữ liệu không phù hợp khi tôi tìm nạp một thực thể theo id ngay sau khi cập nhật thực thể đó. Tôi đang sử dụng JDO 3.0 để truy cập kho dữ liệu của công cụ ứng dụng.Tìm nạp không phù hợp từ kho dữ liệu của Máy ứng dụng của Google
Tôi có một nhân viên tổ chức
@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() * */
}
Ban đầu, khi tôi tạo một nhân viên tôi không đặt mức lương lĩnh vực và email.
Tôi cập nhật thực thể Nhân viên để thêm tiền lương và email sau. Bản cập nhật hoạt động tốt và dữ liệu được tiếp tục lưu vào kho dữ liệu appengine. Tuy nhiên, khi tôi ngay lập tức cố gắng lấy cùng một thực thể nhân viên bằng id, đôi khi tôi nhận được dữ liệu cũ, trong đó tiền lương và email là vô giá trị. Mã tôi sử dụng để tạo và tìm nạp thực thể nhân viên được đưa ra dưới đây.
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();
}
}
Tôi đã đặt số lượng phiên bản không hoạt động thành 5 và có khoảng 8 trường hợp chạy cùng một lúc. Khi tôi kiểm tra các bản ghi của các trường hợp khác nhau, đây là những gì tôi tìm thấy.
Tại sao tôi nhận dữ liệu cũ khi yêu cầu được phân phối bởi một số trường hợp nhất định. Tôi có thể đảm bảo rằng, nếu yêu cầu tìm nạp được xử lý bởi cá thể ban đầu xử lý yêu cầu cập nhật, tôi luôn nhận được dữ liệu cập nhật. Nhưng khi các trường hợp khác xử lý dữ liệu cũ, yêu cầu tìm nạp có thể được trả lại. Tôi đã đặt rõ ràng kho dữ liệu đọc tính thống nhất để mạnh mẽ trong tệp jdoconfig.xml của tôi.
<?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 nhìn vào "nhất cuối cùng" vì điều này nghe có vẻ như thế. –
@PaulCollingwood Tôi đã đặt kho dữ liệu đọc tính thống nhất cho STRONG. –
HariShankar
http://stackoverflow.com/questions/8112331/google-app-engine-jdo-makepersistent-latency – arundevma