Сихнронизация в WEB рипложении(Java Spring)

192
20 марта 2018, 01:26

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

Entity

@Entity
@Getter
@Setter
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name= "increment", strategy= "increment")
    @Column(name = "id", unique = true, nullable = false)
    private long id;
    @Column(name = "login", length = 30, nullable = false)
    private String login;
    @Column(name = "password", length = 30, nullable = false)
    private String password;
    @Column(name = "name", length = 150, nullable = false)
    private String name;
    @Column(name = "count_true_answers", nullable = false)
    private long countTrueAnswers;
    @Column(name = "count_questions", nullable = false)
    private long countQuestions;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_group", nullable = false)
    private Group group;
    @Transient
    private List<Question> questionsUser;
    @Transient
    private Queue<Log> logsUser = new LinkedList<>();
    public User(){
    }
    @Builder
    public User(String login, String password, String name, long countTrueAnswers, long countQuestions, Group group) {
        this.login = login;
        this.password = password;
        this.name = name;
        this.countTrueAnswers = countTrueAnswers;
        this.countQuestions = countQuestions;
        this.group = group;
    }
    public void addLog(Log log){
        logsUser.add(log);
    }
    public void removeQuestion(String title){
        for (Question question : questionsUser) {
            if(question.getTitle().equals(title)){
                questionsUser.remove(question);
                return;
            }
        }
    }
}

Component для проведения олимпиады

@Component
public class OlympiadImpl implements Olympiad {
    @Autowired
    private QuestionsService questionsService;
    @Autowired
    private UsersService usersService;
    private User currentUser;
    public void startOlympiad(String login, String password){
        currentUser = usersService.getUserByLoginAndPassword(login, password);
        currentUser.setQuestionsUser(questionsService.getQuestions());
    }
    public String getStatisticUser() {
        return String.valueOf(currentUser.getCountTrueAnswers() + "/" + currentUser.getCountQuestions());
    }
    public List<Question> getQuestions() {
        return currentUser.getQuestionsUser();
    }
    public Question getQuestion(String title){
        for (Question question : currentUser.getQuestionsUser()) {
            if(question.getTitle().equals(title)){
                return question;
            }
        }
        return currentUser.getQuestionsUser().get(0);
    }
    public Queue<Log> getLogsOfRunningTest(){
        return currentUser.getLogsUser();
    }
    public ResultChecking checkTask(String nameQuestion, String 
        // Проверка задания
    }

    private void delQuestion(String title){
        currentUser.removeQuestion(title);
    }
}

Думаю сервис слой и дао приводить нет смысла, ибо там все очевидно. Выше расположенный код дает возможность проводить олимпиаду только для одного пользователя(добавлять логи, удалять вопрос только для пользователя а не из Бд, если он правильно на него ответил), но хотелось бы, чтобы была возможность для многих. Собственно мысль у меня сделать Map пользователей, хранить cookie пользователей и при обращениии к кому-то методу олимпиады добавлять cookie пользователя(логин или имя), и уже вытаскивать из Map этого пользователя и проводить с ним операцию. но мне кажется такой подход не совсем удачный, куча дополнительныйх расходов как по времени так и по памяти. Пробовал scope prototype указывать, но он каждый раз создает новый класс олимпиады... Может быть есть какие-либо инструменты для этого у Spring или java или быть может мой подход тоже окажется подходящим в этой ситуации?

READ ALSO
java. Цикл for совершает по два прохода за раз

java. Цикл for совершает по два прохода за раз

ЗдравствуйтеНикак не могу понять, почему при следующем коде фор по два прохода за раз делает, когда я ожидаю один проход?

177
Как сделать методы общими для 2 классов

Как сделать методы общими для 2 классов

ЗдравствуйтеПомогите решить проблему

192
Счётчик объектов

Счётчик объектов

Как создать в конструкторе объекта счётчик, который будет вписывать в поле объекта номер его создания? То есть первый объект имеет номер...

175