2

我正在使用DN3和GAE 1.7.4。 我使用JPA2,默認情況下根據文檔啓用了Level2緩存。谷歌應用程序引擎java datastore緩存JPA查詢結果嗎?

這裏是我的問題:

如果我運行,返回某些對象的查詢,將通過他們的ID自動把緩存中的這些對象呢?

如果我運行的em.find()的對象的id已經加載了另一個查詢createQuery().getResultList()它會在緩存中可用嗎?

我是否需要在事務中運行我的em.find()或查詢才能緩存?

我需要澄清一下這個緩存是如何工作的,以及如何做我的查詢/發現/持久化以便充分利用緩存。

感謝

回答

3

在開發本地GAE模式下進行調試後,我認爲二級緩存有效。無需事務開始/提交。我對主鍵和em.find()的簡單查詢的結果將通過它們的主鍵放入緩存中。

然而,在本地開發服務器的默認緩存超時就像是一個幾秒鐘,我必須補充一點:

<property name="datanucleus.cache.level2.timeout" value="3600000" /> 

到persistence.xml中。

3

Google App Engine: Using JPA with App Engine

Level2的高速緩存默認情況下啓用。要獲取先前的默認 行爲,請將持久性屬性datanucleus.cache.level2.type 設置爲none。 (或者包括在 classpath中DataNucleus將緩存插件,並設置持久性屬性 datanucleus.cache.level2.type到javax.cache使用內存緩存的L2緩存 。

至於你的疑惑,這取決於你的查詢,以及DataNucleus將和GAE數據存儲適配器實現細節。作爲Carol McDonald suggested我相信,最好的路徑找到您的問題的答案與JPA2 Cache接口...更具體地說,contains方法。

運行您查詢,通過012訪問Cache接口並查看二級緩存contains是否是所需的實體。

啓用DataNucleus日誌也會給你提供有關幕後發生的事情的好消息。