środa, 9 listopada 2011

Hibernate L1 cache a cachowanie zapytań.

Niby wszyscy wiedzą jak działa działa L1 cache w Hibernate. W ramach jednej sesji hibernata, jeśli wczytamy sobie jakiś obiekt za pomocą np. funkcji .get(), to każde kolejne wywołanie tej funkcji nie odpytuje już bezpośrednio bazy danych, tylko zwraca ten obiekt właśnie z sesji. Pytanie, czy jesteśmy świadomi wszystkich konsekwencji takiego podejścia?

Proponuje zagadkę.
W bazie jest 2 użytkowników z tego samego miasta: Andrzej i Wojtek. Metoda getAllUsersFromCity() tworzy odpowiedni obiekt Criteria i zwraca listę użytkowników z danego miasta. Przyjmijmy, że kod funkcji testCache() wykonywany jest w ramach jednej sesji hibernata:

public void testCache(){
    printUsers();
    //w tym momecie ktoś inny edytuje jednego z użytkowników,
    //w zupełnie innej sesji lub bezpośrednio na bazie,
    //zmienia nazwe z Andrzej na Bartek
    printUsers();
}

public void printUsers(){
    List<User> users = dao.getAllUsersFromCity("city");
    foreach(User user : users){
        System.out.println(user.getName());
    }
}

Co zostanie wyświetlone na ekranie?
a)AndrzejWojtekAndrzejWojtek
b)AndrzejWojtekBartekWojtek