我正在開發一個帶有應用程序引擎的小型後端。現在我用不同的值多次保存一個實體後會出現一些奇怪的行爲。 我的代碼加載的實體是所有實體一樣的 - 每個實體獲得一個changeId所以我只能改變實體轉移到客戶端:App Engine:同一對象化查詢的不同結果
public class VersionableRecordHelper<T extends VersionableRecord> {
final Class<T> clazz;
public VersionableRecordHelper(Class<T> clazz) {
this.clazz = clazz;
}
Query<T> load() {
return ofy().load().type(clazz);
}
List<T> loadOrdered() {
return load().order("changeId").list();
}
public List<T> loadOrdered(Long since) {
return since == null ? loadOrdered() : load().filter("changeId >", since).order("changeId").list();
}
}
的客戶則可以通過提供since
查詢類的所有對象值。例如:
private final VersionableRecordHelper<Cat> helper
= new VersionableRecordHelper<>(Cat.class);
// actually an @ApiMethod, simplified here
public List<Cat> getCats(Long since) {
return helper.loadOrdered(since);
}
我的貓實體如下所示:
@Entity
@Cache
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class Cat extends VersionableRecord {
// some fields, getters, setters
}
public class VersionableRecord {
@Id
private String id;
@Index
private Long changeId;
// getters, setters and more
}
現在,如果我做since == 4
相同REST請求,我得到完全不同的結果 - 有時changeId == 5,,但也與2,3或4 - 這應該不可能!
我完全迷失在這裏。這是我檢查:
- 我沒有在測試過程中更改記錄。事實上,我完全離開了超過90分鐘的記錄。
- 我檢查到只有一個應用程序引擎實例正在運行。
- 我試圖刷新內存緩存 - 但相同的2個ObjectifyCache鍵不停地四處移動。
- memcache服務級別爲'共享'。
- 我檢查了
since
的值不是空的任何機會。所以代碼肯定會被執行。 - 當前我使用的是objectify版本5.0.3。從我的build.gradle:
compile 'com.googlecode.objectify:objectify:5.0.3'
- 我還相信實體通過檢查https://console.developers.google.com/project/project-id/datastore/query?authuser=0
有沒有人有一個有益的觀點在數據存儲中的正確changeId?我還檢查了不同類型的實體 - 相同的行爲。
也許我只是說明顯而易見。但是,你確定當你進行REST調用時,你的代碼實際上正在被打擊,並且中間沒有http緩存給你返回錯誤的以前的值)? – Claudio
嘿@Claudio - 不,絕對不是。我可以用'curl'實用程序調用它,但仍然會得到不同的結果。瀏覽器,捲曲,iOS應用程序 - 仍然一樣。 – mreichelt
我發現如果我*手動關閉*我的實例,並讓一個新的自動啓動,一切按預期工作。但這不可能是解決方案。 ;) – mreichelt