Как правильно использовать Spring Data Jpa и Hibernate в многопоточной среде? - PullRequest
0 голосов
/ 14 апреля 2019

Я использую Spring Data Jpa с Hibernate. В многопоточности у меня есть синхронизированный блок, который будет сохранять некоторые объекты. Если объект не существует, вместо этого создайте новый.

synchronized block
Student student = studentRepo.findByName(name); //student do have unique constraints on db
if(student==null){
  student = new Student();
  student.setName(name);
  student = studentRepo.save(student);
}
//outsize sync block
//logic to handle students

Поведение, которое я хочу иметь, заключается в том, что когда поток 1 создал студента, поток 2 должен иметь возможность найти созданного студента вместо создания дублированного студента с тем же именем, что в результате приведет к уникальному нарушению.

Я знаю, studentRepo.save не передает объект ученика правильно, но объект не будет сохранен в памяти, и Hibernate сначала выполнит поиск в памяти, а затем, если не найден, он пойдет в дб? Я также попробовал saveAndFlush, он также получает то же самое глючное поведение. Реальный объект, который я использую, более сложен, он соединяется с другими.

Поправь меня, если я ошибаюсь. Теперь я просто хочу узнать, как сделать сохраненный студент доступным между различными потоками, чтобы мой код не пытался вставить дубликаты данных в базу данных.

Поток 1 завершил сохранение и выходит из блока синхронизации, затем поток 2 входит в блок, когда поток 2 выполняет findByName, я хочу в Thread2 получить созданного ученика.

Есть ли какие-либо дополнительные настройки, которые мне нужно сделать, чтобы получить такое поведение? Я использую Spring boot, все по умолчанию, только что настроенный источник данных. Также приведенный выше код аннотирован @Bean singleton, и этот класс обрабатывает только бизнес-логику.

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