У меня есть таблица студентов в БД, которая имеет имя, тему и метки в ней. 1 студент может иметь несколько записей для разных предметов в этой таблице.Как следует использовать синхронизацию в случае строк?
У меня есть студенческий класс DAO, который имеет метод обновления, как это:
public marks updateStudent(String name, String subject, int marks){
//this method first check if the record of this name and subject is there in DB
if(getStudentRecordFromDB(name, subject){
//then return marks for this student
}else{
//insert the record in DB and return marks
insertRecord(name, subject, marks);
}
}
Этот метод может быть вызван несколькими потоками одновременно для же именем студента и предмета. Я хочу, чтобы он синхронизировался только в том случае, если несколько потоков обновили одно и то же имя и тему. Итак, я подумал о синхронизации этого метода в строке имени + субъекта, но поскольку это плохая практика, также не дающая мне guranteed результаты из-за строкового константного пула (наличие этой строки в нем), я хочу использовать некоторое лучшее решение. Я не хочу синхронизировать с DAO.class, поскольку хочу синхронизацию только в случае обновления одного и того же файла. Какой должен быть лучший способ сделать это?
Вам не нужно синхронизировать обновления БД - зачем вы это хотите? –
На стороне БД нет ограничений, чтобы вставить несколько записей для того же имени и темы. И, к сожалению, я ничего не могу изменить в БД. Поэтому мне нужно синхронизировать его только в моем java-сервисе. Я знаю, что это может быть плохой дизайн, но я не могу с этим поделать, и я хочу, чтобы это решение работало только с Java-кода. –
Здесь вы хотите использовать транзакции базы данных, и вы хотите заблокировать запись для обновления в методе 'getStudentRecordFromDB' (или использовать оптимистичную блокировку). Хотя технически возможно синхронизировать в String (используйте метод String.intern перед синхронизацией, чтобы получить уникальный экземпляр), он не защищает вас от другого приложения, работающего в той же базе данных, или против развертывания кластера, где несколько экземпляров вашего приложение запущено. –