2

我已经尝试通过在 persistence.xml 中使用以下属性来禁用 EclipseLink 中的 L2 缓存和 Eclipse indigo:-

<property name="eclipselink.cache.shared.default" value="false"/>

<shared-cache-mode>NONE</shared-cache-mode>

基本上我正在测试一个场景,无论是在两个不同的会话中创建的同一个对象两次访问数据库还是两个会话都引用在内存缓存中的早期会话中创建的同一个对象。这不应该是因为通过在 persistence.xml 中提及上述属性禁用了 L2 缓存

我的代码如下: -

 Session session = DataAccessManager.getManager().openSession();
 ReferenceObjectRepository referenceObjectRepository =     ReferenceObjectRepository.getInstance();
 ReferenceObjectKey referenceObjectKey = new ReferenceObjectKey(getStringValue("testCacheByPass.input"));
 //load object first time.
 ReferenceObject referenceObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey);
 logger.log(Level.SEVERE, "Cache ReferenceObject: " + referenceObject);

 //load object in another session
 Session sessionNew = DataAccessManager.getManager().openNewSession();
 Object dbObject = referenceObjectRepository.load(ReferenceObject.class,    referenceObjectKey);
 logger.log(Level.SEVERE, "DB loaded ReferenceObject: " + dbObject);

请帮助我是否错过了什么?还是我需要以其他方式做到这一点?

4

2 回答 2

3

在进行调用的每个函数中添加此行。在查阅视图时,我在查找功能中使用。

((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();

此行在运行 de 查询之前清除缓存。

public Entity find(Object id) {
    ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();
    return em.find(Entity.class, id);
}
于 2012-10-25T19:33:35.247 回答
1

您已禁用对象缓存,但我认为您仍然有查询缓存在使用。您应该也可以禁用查询缓存

<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>

同样的事情也可以用查询提示来设置。如果 persistence.xml 配置似乎不起作用,您也可以尝试使用查询提示。

另请注意,本质上,即使没有缓存,您也会比较同一个对象,因此除非它被分离,否则它应该是相同的。

相关问题:

于 2012-10-17T05:23:42.777 回答