我尝试使用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);
请问我是否错过了什么?或者我是否需要以其他方式进行?
答案 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配置似乎不起作用,您也可以尝试使用查询提示。
另外请注意,即使没有缓存,你也要比较同一个对象,所以除非它被分离,否则 应该是相同的。
相关问题: