jpa从缓存中获取数据而不是数据库eclipaslink

时间:2014-01-02 19:15:57

标签: caching jpa eclipselink

您好我正在使用jpa(eclipselink)的小项目中工作,我从不同的tomcat运行两个相同的应用程序,他们使用相同的架构,但如果我是 从一个应用程序改变值,另一个应用程序不从数据库中获取数据, 它总是返回它的本地数据,我也在实体类和

中尝试了这个@Cacheable(false)
<property name="eclipselink.cache.shared.default" value="false" />
<property name="eclipselink.query-results-cache" value="false"/>

在xml文件中,但它们没有从数据库返回最新数据,我的代码如下:

EntityManager entityManager = GlobalBean.store.globalEntityManager();
String queryString = "select g from GlobalUrnConf g";
TypedQuery<GlobalUrnConf> globalUrnConfQuery = entityManager.createQuery
    (queryString, GlobalUrnConf.class);
return globalUrnConfQuery.getSingleResult();

我通过以下方式获取实体经理和工厂 -

  public EntityManagerFactory factory() {
    if (this.entityManagerFactory == null) {
     entityManagerFactory = Persistence.createEntityManagerFactory("FileUpload");
      }
      return this.entityManagerFactory;
  }
  public EntityManager globalEntityManager() {
    if (this.entityManager == null) {
      this.entityManager = factory().createEntityManager();
    }
    return this.entityManager;
 }

请帮帮我。提前谢谢。

2 个答案:

答案 0 :(得分:0)

return globalUrnConfQuery
    .setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheOnly)
    .getSingleResult();

答案 1 :(得分:0)

您正在缓存EntityManager,缓存并保留在托管实体上,以便通过它读取它以实现身份和管理更改。你可以通过使用刷新查询提示或其他查询提示来解决这个问题,这样他们就可以避免使用缓存了,但是你可能更好的是直接管理EntityManager的生命和缓存,只在需要时获取它们,或者在返回实体可以释放时的逻辑点。例如,尝试调用EntityManager clear。