EclipseLink禁用每个查询的更改跟踪

时间:2016-04-16 09:23:58

标签: jpa caching eclipselink change-tracking

由于EclipseLink中的更改跟踪,我们目前的应用程序出现严重减速。问题是自制的,我们不会按原样使用JPA。

我想知道,我如何获得缓存命中(第1级),但不要在变更跟踪中包含这些实体,除非满足某些条件。

// not real code, but close if you decompose the layers and inline methods
public void foo(Long customerId, boolean changeName, String newName) {

    /*** check customer valid ***/
    // #1 HOW TO discard from change tracking? – Customer won’t get modified!
    Customer customer = entityManager.find(Customer.class, customerId); 

    // some Business Rules
    // #2 They should be auto discarded from change tracking because #1 is also discarded)
    checkSomething(customer.getAddresses());
    checkSomething(customer.getPhoneNumbers ());
    …

    /*** manipulate customer ***/
    // somewhere else in different classes/methods …
    if(changeName) {
        // #3 HOW TO get Cache hit (1st level) - it was read in #1
        // newName should be persisted
        customer = entityManager.find(Customer.class, customerId); 
        customer.setName(newName);
    }
}

对#1和#2

使用EclipseLink API是可以的

我更喜欢提示。

EclipseLink 2.4.2

二级缓存:已停用

ChangeTrackingType:DEFERRED

1 个答案:

答案 0 :(得分:0)

尝试使用read-only查询提示,可以作为查找或查询的属性传递,有关提示的详情,请参阅this。只读提示应从共享的第二级缓存中返回实例,不应修改该实例。由于它未添加到第1级EntityManager缓存,因此没有提示的任何其他读取将构建/返回托管实例。

文档声明这适用于非事务性读取操作,因此我不确定如果EntityManager使用事务连接进行读取,它将如何工作,因为它不会使用共享缓存来读取事务。