Spring boot кеширует результаты без включения - PullRequest
0 голосов
/ 06 апреля 2020

Я использую Spring boot уже пару лет, но недавно я столкнулся с необычной ошибкой. При вызове GET API весеннего загрузочного приложения из моего приложения angular он возвращает меньшее количество строк, чем фактическое число, присутствующее в БД.

Вышеупомянутая проблема решается в момент повторного развертывания приложения весенней загрузки. Подозревая, что это какая-то проблема с кэшированием, я сохранил этот заголовок.

Примечание. Я не включил кэширование в приложении.

Другой подозреваемый объект - EntityManager, не получающий обновилась. Я использую репозиторий Spring для извлечения данных, менеджер объектов не обрабатывается моим пользовательским кодом. Итак, я не уверен, как это может произойти.

Я использую экземпляр AWS RDS postgresql в качестве своей базы данных.

После двух дней неудачного преследования я поместил его здесь для мнений экспертов

@Data
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "uid_gen_seq")
    @SequenceGenerator(name = "uid_gen_seq", allocationSize = 1)
    @Column(name = "user_id", updatable = false, nullable = false)
    private long userId;
    private String name;
    private String address;
    @Column(name = "ph_no")
    private String phNo;
    @Column(name = "rent_pass")
    private int rentPass;
    @CreatedBy
    private String createdBy;
    @LastModifiedBy
    private String modifiedBy;
}

Метод контроллера:

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserVO>> getAllUsers()
        throws Exception, NoContentException {
    return ResponseEntity.ok(userService.getAllUsers());
}

Метод обслуживания:

@Override
public List<UserVO> getAllUsers() throws NoContentException {
    logger.info("Get all users");
    List<User> users = userRepository.findAll();
    List<UserVO> userVOs = converter.convertToVO(users);
    return userVOs;
}

Обновление:

Я думаю, что я сузил возможные случаи до 1. Это сессия не обновляется. Насколько я понимаю, вызов метода репозитория неявно создает сеанс и закрывает его. Если метод службы или контроллера не был аннотирован @ Transactional.

Методы службы в моем случае не были аннотированы @Transactional, тем не менее сеанс не получал refre sh.

В качестве обходного пути я аннотировал методы с помощью @Transactional (TxType.REQUIRED_NEW), чтобы избежать использования любого старого сеанса. На данный момент это работает, но я все еще не убежден в поведении приложения без этого обходного пути.

1 Ответ

0 голосов
/ 06 апреля 2020

Как вы вставляете данные? если вы не вставляете через свое приложение, то кеши не перезагружаются. Посмотрите этот ответ - Кешируются ли сущности в jpa по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...