0

我有一个 Java Web 应用程序,我正在通过 JPA2 (EclipseLink) 访问一个 Oracle 11g 数据库

现在必须对存储的数据进行一些更改,但我的应用程序仍在缓存旧值。

问题:如何强制我的应用程序删除整个缓存并从数据库重新加载数据(在应用程序运行时)?

我尝试了以下方法,但似乎没有效果:

@ManagedBean
@SessionScoped
public class CacheEvictall implements Serializable {
    // (...)

    public void evictDatabaseCache() {
        // clear persistence cache
        EntityManager em = emf.createEntityManager();

        if (em != null) {
            LOGGER.info("Evicting database cache!");
            try {
                utx.begin();
                emf.getCache().evict(FooClass.class);
                emf.getCache().evict(BarClass.class);
                // or: emf.getCache().evictAll();
                em.flush();
                utx.commit();
            } catch (Exception e) {                
                e.printStackTrace();
            }
        } else {
            LOGGER.log(Level.WARNING, "No EntityManager! Cannot evict cache!");
        }
    }
}

我什至重新启动了应用程序服务器(Glassfish v3.1.2)并重新部署了应用程序本身,但效果相同:没有任何反应。

提前谢谢你

4

1 回答 1

1

evict 将使缓存失效并确保下一个查询从数据库返回数据。

如果您重新启动应用程序服务器,但仍然看不到更改,那么我的猜测是您没有更改数据。检查您是否提交了事务,并检查您是否正在更新正确的数据库。还要确保您没有在启动时删除和重新创建表。

于 2012-12-11T15:48:57.147 回答