2015-11-21 4 views
0

Я следую учебнику here Spring Caching и столкнулся с проблемой при попытке его расширения.Проблема с кэшированием Spring

Я продлил Book объект включить author свойство:

public class Book { 

    private String isbn; 
    private String title; 
    private Author author; 

    public Book(String isbn, String title, Author author) { 
     this.isbn = isbn; 
     this.title = title; 
     this.author = author; 
    } 
    ... 
    ... 

Теперь, когда я ищу book, который имеет ту же author, я бы предположил, что это будет хит кэш один раз, что author был сохранен, однако мой пример кода доказывает иначе.

Вот мой main класс:

public void run(String... args) throws Exception { 
     log.info(".... Fetching books"); 
     log.info("isbn-1234 -->"); 
     log.info(bookRepository.getByIsbn("isbn-1234").toString()); 
     log.info("isbn-4567 -->"); 
     log.info(bookRepository.getByIsbn("isbn-4567").toString()); 
    } 

Вот мои Repos:

public class SimpleBookRepository implements BookRepository { 

    private AuthorRepository authorRepo; 

    String[] authors = new String[]{"Test User"}; 
    Random random = new Random(); 


    public SimpleBookRepository(AuthorRepository authorRepo) { 
     this.authorRepo = authorRepo; 
    } 

    @Override 
    @Cacheable(cacheNames={"books","authors"},key="#isbn") 
    public Book getByIsbn(String isbn) { 
     simulateSlowService(); 
     //int rNum = random.nextInt(authors.length); 
     Author a = authorRepo.getByName(authors[0]); // <-- Should get from cache! Why isnt it! 
     return new Book(isbn, "Some book", a); 
    } 

    private void simulateSlowService() { 
     try { 
      long time = 5000L; 
      Thread.sleep(time); 
     } catch (InterruptedException e) { 
      throw new IllegalStateException(e); 
     } 
    } 
} 


public class SimpleAuthorRepository implements AuthorRepository { 

    @Override 
    @Cacheable(cacheNames="authors", key="#name") 
    public Author getByName(String name) { 
     simulateSlowService(); 
     return new Author(name); 
    } 

    private void simulateSlowService() { 
     System.out.println("Getting from DB"); 
     try { 
      long time = 5000L; 
      Thread.sleep(time); 
     } catch (InterruptedException e) { 
      throw new IllegalStateException(e); 
     } 
    } 

} 

Когда я запускаю мой пример мой выход указывает на то, что автор не извлекается из кэша:

INFO 6944 --- [main] config.Application: .... Fetching books 
INFO 6944 --- [main] config.Application: isbn-1234 --> 
Getting from DB 
INFO 6944 --- [main] config.Application: Book [isbn=isbn-1234, title=Some book, [email protected]] 
INFO 6944 --- [main] config.Application: isbn-4567 --> 
Getting from DB 
INFO 6944 --- [main] config.Application: Book [isbn=isbn-4567, title=Some book, [email protected]] 

Любая идея о том, почему она не попадает в кеш при получении autho р? Я в тупике.

Благодаря

ответ

0

Как вы можете видеть в вашем след как книги экземпляры относятся к одному автору, например [email protected]. Итак, что вы видите в журналах, книга не кэшируется, что нормально, потому что вы используете разные isbn

+0

Можно было бы подумать, что это должно произойти. Я не понимаю, почему объект author не будет кэшироваться в 'AuthorRepository', так как они имеют одинаковое имя и это мой кеш-ключ. – Dan

+0

Он кэшируется, иначе 'new Author (name)' будет создавать разные экземпляры. Вы уверены, что у вас нет «Получение от БД» в SimpleBookRepository? Код, который вы показали, не может произвести такой вывод – hoaz

+0

Да, я уверен, что у меня нет этого текста в 'SimpleBookRepository'. – Dan

Смежные вопросы