Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Non-Strict Read-Write Cache

Wenn man bei einer Entity viele Schreiboperationen ausführt, kann der Overhead, der durch das Aktualisieren das Caches entsteht, nicht unerheblich sein. Hier gibt es eine Alternative: Der Non-Strict Read-Write Modus: Hier wird beim Schreiben lediglich eine Markierung gesetzt, dass der Cache nicht mehr aktuell ist. Dadurch muss beim nächsten Lesezugriff nach einer Änderung erneut auf die Datenbank zugegriffen werden.

Nonstrict Read-Write
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Customer {
    @Id
    private Long id;
    private String firstname;
    private String lastname;

Das Verhalten lässt sich wie folgt beschreiben:

Nonstrict Read-Write-Test
Customer c = new Customer();
c.setId(2L);
c.setFirstname("Alice");
c.setLastname("Rogers");
doInHibernate(em -> withTransaction(em, () -> em.persist(c)));
Customer customerOutside = getCustomerAlice();
customerOutside.setFirstname("Buck");
saveCustomer(customerOutside);

doInHibernate(em -> {
    Customer customer = em.find(Customer.class, 2L);
    withTransaction(em, () -> em.remove(customer));
});
assertSelectCount(2);

Wir sehen hier also 2 Selects. Wo ist dann überhaupt noch der Vorteil? Dieser Modus hat dann Vorteile, wenn wiederholt gelesen wird, ohne dass eine Änderung aufgetreten ist:

Nonstrict Read-Write Benefit
Customer c = new Customer();
c.setId(2L);
c.setFirstname("Alice");
c.setLastname("Rogers");

doInHibernate(em -> withTransaction(em, () -> em.persist(c)));

for (int i = 0; i < 10; i++) {
    // second loop hits the cache
    Customer customerOutside = getCustomerAlice();
}

assertSelectCount(1);

Obwohl wir 10 find Operationen durchführen, gibt es nur einen Select.