Я следую учебнику 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 р? Я в тупике.
Благодаря
Можно было бы подумать, что это должно произойти. Я не понимаю, почему объект author не будет кэшироваться в 'AuthorRepository', так как они имеют одинаковое имя и это мой кеш-ключ. – Dan
Он кэшируется, иначе 'new Author (name)' будет создавать разные экземпляры. Вы уверены, что у вас нет «Получение от БД» в SimpleBookRepository? Код, который вы показали, не может произвести такой вывод – hoaz
Да, я уверен, что у меня нет этого текста в 'SimpleBookRepository'. – Dan