我是否可以提示Eclipselink在本机查询后使用共享缓存

时间:2015-09-25 09:36:41

标签: java-ee jpa caching eclipselink jpa-2.0

在JPA(eclipselink)应用程序中,我有一个ejb业务操作,在继续使用非本机jpa调用之前必须执行本机查询(oracle)。该本机调用是某种报告,它不会选择甚至更改我在数据库中的任何实体。

然而,eclipseLink将事务标记为脏,并且以下非本机jpa调用不再使用共享缓存。 eclipseLink用户指南中记录了此行为,请参阅here,以及预期的。

但有没有办法告诉eclipseLink不要将事务标记为脏,例如本机查询中的一些提示?我需要以下jpa-queries才能使用共享缓存。

创建本机查询的代码是拦截器的一部分,如下所示:

public class MyInterceptor {
  @PersistenceContext( name="xxxx" )  
  private EntityManager em;  

  @AroundInvoke  
  Object init( InvocationContext context ) throws Exception {  
    // the result of the native query is a plain date resulting
    // from a non-trivial query of course
    Date now = (Date)em.createNativeQuery( "select sysdate from dual" )
                       .getSingleResult();  
    return context.proceed();  
  }
}

其余的业务逻辑封装在ejb中,例如

@Stateless
public class BusinessEJB {

  @PersistenceContext(name="xxxx")
  private EntityManager em;

  @Interceptors( { MyInterceptor.class } )      
  public List<Result> find() {
    // Result is quite complex with lots of related detail objects
    // which I would like to fetch from the shared cache.
    // The entity Result is annotated @Cacheable( false ) and the 
    // detail entities are @Cacheable( true ). persistence.xml contains 
    // <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    return em.createNamedQuery("Result.findAll",Result.class)
             .getResultList();
  }
}

每当我移除拦截器时,一切都很好。当我们在persistence.xml中启用查询日志时,我们看不到详细对象的查询。但添加拦截器会导致大量数据库调用获取详细信息。

我在glassfish 3.1.2.2上使用jee6 with eclipselink 2.3.2

0 个答案:

没有答案