如何在eclipselink中禁用缓存

时间:2012-10-17 02:42:50

标签: java caching jpa-2.0 eclipselink

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

<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);

请问我是否错过了什么?或者我是否需要以其他方式进行?

2 个答案:

答案 0 :(得分:2)

在进行调用的每个函数中添加此行。我在咨询视图时使用了find函数。

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

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

public Entity find(Object id) {
    ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();
    return em.find(Entity.class, id);
}

答案 1 :(得分:1)

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

禁用查询缓存
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>

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

另外请注意,即使没有缓存,你也要比较同一个对象,所以除非它被分离,否则 应该是相同的。

相关问题:

相关问题