Взаимодействие экземпляра DAO и Singelton Bean весной - PullRequest
0 голосов
/ 06 сентября 2018

Предположим, у меня есть DAO с именем Assignment, который объявляется с помощью карты @Document с именем коллекции Mongo.

Затем у меня есть служебный компонент, например AssigmentImpl, который находится в одноэлементной области, выполняя операцию обновления, при которой он извлекает сохраняемый DAO и обновляет некоторые с помощью входных данных REST для Назначения.

@Service
public class AssignmentImpl{    
public Assignment updateAssignment(Assignment assignment){
    Assignment assignmentExsisting  = assignmentRepo.getAssignment(assignment.getId());
    BeanUtils.copyProperties(assignment,assignmentExsisting);
    assignmentRepo.save(assignmentExsisting);    
}    
}

Допустим, несколько потоков (пользователей) выполняют операции обновления для разных назначений.

Будучи AssignmentService одноразовым, он будет возвращать одну и ту же копию разным пользователям. Как это ссылается на объект назначения? Если я скажу, поскольку объект Assignment не является одноэлементным, он будет возвращать разные ссылки на объекты в AssignmentImpl, когда каждый пользователь выполняет операцию обновления, верно?

В этом случае пользователь A может получить идентификатор 123 назначения перед выполнением операции обновления, а когда пользователь B начнет выполнять операцию обновления, AssignmentImpl изменит ссылку на назначение на другой идентификатор 456. В этом случае пользователь A обновит совершенно другое назначение. , Это возможно? Если так, как мы можем предотвратить это? Сделайте операцию обновления синхронизированной или есть другие хорошие решения?

1 Ответ

0 голосов
/ 06 сентября 2018

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

Например, два автобуса начинают поездку из пункта А в пункт Б. Теперь ни у одного из автобусов нет общих пассажиров (это не возможно, верно?), У обоих есть свои пассажиры и собственное топливо, однако механизм (хранилище и обслуживание) ) для обоих автобусов остается одинаковым.

Вы видите, что два потока здесь ничего не делят, насколько я могу судить, да, он использует компонент репозитория, но не изменяет своего состояния, он просто отправляет назначение в хранилище и id для получения назначения.

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