java web应用程序缓存数据,如何阻止它使数据不陈旧!

时间:2011-03-22 05:14:27

标签: java caching toplink toplink-essentials

嗨,我有问题。我(我猜)持久层是缓存我的结果,所以当我从我的应用程序外部更新数据库时,数据仍然是陈旧的。

然而,它只缓存了一半的时间,我希望这是有道理的,

我有一个班级

@Entity
@Table(name = "PROVINCE")
public class Province implements Serializable {

@Id
@GeneratedValue
int id;

String provinceName;

String provinceMoto;


Buildings buildings;


Units units;


Person person;

.... etc

现在,如果我更新任何不是类对象引用的数据,比如'省名',那么我的应用程序中的数据就可以了,并立即更新。然而,像'建筑'这样的内部对象没有,我无法弄清楚如何,如果我像重新部署我的应用程序一样进行硬刷新,那么数据是新鲜的。

我从数据库中获取我的省份:

Query query = manager.createQuery("select p from Province p where p.person = :query");
        query.setHint("toplink.refresh", "true");
        query.setParameter("query", p);

        province = (Province) query.getSingleResult();

那么我如何强迫它也使该类的内部对象,即“建筑物”'人'也更新。

我的持久层是toplink essentials,我修复了我之前没有数据更新的问题。并且第一篇文章here(it's another stack overflow page)

谢谢你的帮助。我希望我能很好地解释我的问题

[编辑:就像我没有使用这个框架一样,只是更容易加入数据库中的表并在新变量中重新填充数据,但我不是]

2 个答案:

答案 0 :(得分:2)

这是“当我......”时“痛苦的医生”。“不要这样做”。

如果您要更新Toplink背面的数据库,那么您必须像对待数据一样刷新数据。

每次在JPA中使用“select”类型查询时,它都会命中数据库。但是,正如您所了解的,对于相关对象,它只是从数据库中提取密钥,然后优先使用缓存版本来访问数据库。

Toplink有2个缓存。 1级和2级缓存。 1级缓存是当前会话的基于事务的缓存使用。 2级缓存类似,但应用程序范围广泛且范围广泛。二级缓存是您最有可能遇到的问题。

因此,您需要继续使用Toplink刷新提示,或者完全禁用Level 2 Cache。

答案 1 :(得分:0)

将数据更新到数据库后,创建您的值对象(也是子值对象)或使用默认值进行重新数据化。希望这会解决你的问题。