2012-08-17 80 views
1

加載實體工作,我通過鑰匙或ID用於加載和存儲實體簡單的一層,我只是加入緩存到這一層。當具有給定密鑰的實體在緩存中時,返回它而不是從數據存儲中獲取。當實體更新並保存到數據存儲區時,層簡單地將緩存中的實體設置爲null。它是完全透明的。GAE,JDO:從緩存

這似乎是工作正常,但是從緩存中獲取的對象是從對象從數據庫中獲取略有不同。例如,有些東西停止工作,我不能在集合實體內使用.contains()來檢查兩個實體之間是否存在關係。我也遇到了一個奇怪的行爲,當我從緩存中加載對象並立即在存儲到數據存儲之後,代表關係的集合中的所有項目都被替換爲null s。但我無法複製它。現在它工作正常。

我不知道什麼是引擎蓋下發生的,所以問題是,與高速緩存可靠這種工作方式?我能像使用從數據存儲中獲取的實體一樣處理從緩存中獲取的實體(訪問子代,更新,刪除...)嗎?

回答

3

有兩點需要注意:

  1. 存儲到內存緩存中的所有對象獲得serialized/deserialized,這意味着他們的內存表示取,改變成一系列字節(反之亦然)的。

  2. Collection.contains(object)使用object.equals(anotherObject)來檢查集合是否包含某個對象。默認Object.equals()只有true如果這是exact same object(=在同一內存位置的對象)。

鑑於:序列化對象,然後反序列化它不會讓一個對象,讓deserialisedObject.equals(originalObject) == true

如果你真的需要這個,你應該在Memcache中存儲的類中重寫.equals()(也可以是.hashCode()),以便實際比較Class中的有意義值(=所有字段的比較值)。

+0

感謝解釋如何'Collection.contains(對象)'的作品,我知道對象得到初始化/反序列化,但我不知道這會導致此問題。還有其他事情要注意嗎?爲了重複我原來的問題,除了這個(自然也就是實體可能已經過期),我可以像使用數據存儲區一樣使用緩存實體嗎? – tobik 2012-08-17 16:56:22

+0

本例中的實體是POJO,對吧?那麼是的,如果你確保他們正確序列化,你可以像使用數據存儲一樣使用它們。但要小心比較它們的解釋。 – 2012-08-17 19:22:23

+1

是的,他們是。使用@PersistenceCapable註釋提升簡單類。所以這是個好消息,謝謝。正如你所建議的那樣,我重寫了equals()和hashCode()方法,所以現在我可以按照我想要的方式比較它們。 – tobik 2012-08-18 08:07:22