0

我已升级到 appengine sdk 1.8.0、appengine DN 2.1.2 和 DN 3.1.3。一切都很好。

在它声明的 appengine 文档中

Level2 Caching is enabled by default. 

https://developers.google.com/appengine/docs/java/datastore/jpa/overview-dn2

我假设 JPA L2 缓存由 memcache 支持。

但是当我通过数据存储查看器更新实体时,JPA 代码仍然返回过时的数据版本。

我的 JPA 实体在下面

@Entity
@Cacheable(true)
@NamedQueries({ ....snip

public class GeoLocationUser implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

private double latitude;

查询是命名查询

@NamedQuery(name = GeoLocationUser.FIND_BY_USER_KEY,
            query = "Select p from GeoLocationUser p where p.parentKey = :userKey"),

用例

  1. 实体是使用 JPA 代码创建的。

  2. 我使用数据存储查看器将实体中名为“纬度”的字段从“0.0”更新为“1.0”。

  3. 我使用 JPA 在我的应用程序上运行一个安静的查询。

  4. 返回的实体具有“纬度”=“0.0”

  5. 然后我刷新内存缓存

  6. 我使用 JPA 在我的应用程序上运行一个安静的查询。

  7. 返回的实体具有“纬度”=“0.0”

JPA 代码正在获取过时的数据,我不知道为什么。

Q1.我最欣赏对观察到的行为的任何解释。

Q2。appengine DN 2.1.2 是否由 memcache 支持?

谢谢-lp

4

1 回答 1

1

从日志看来,确实 2 级缓存“软”是默认设置。不知道“软”是什么意思。

但是,似乎 1 级缓存导致了上述行为。

当我停止正在运行的实例时,下一次调用会导致一个具有新 1 级缓存的新实例。然后返回新值。

非常令人印象深刻的缓存家伙。做得好。

-lp

于 2013-05-27T09:31:26.913 回答