#java #spring #hibernate #jpa
#java #spring #спящий режим #jpa
Вопрос:
public class A {
String name = "foo";
}
@Service
public class B {
private final Repository repo;
public void someMethod(){
A a = repo.findByName("foo");
a.name = Thread.currentThread().getName();
repo.save(a);
}
}
Представьте, что 2 потока выполнили someMethod одновременно. Особенно в реализации гибернации jpa.
Мое мнение таково, что существует условие гонки.
Первый и второй потоки получают один и тот же объект с именем foo. Если я не ошибаюсь, без оптимистичной блокировки в этом сценарии будет ошибка.
Также оптимистичная блокировка вызывает исключение, поэтому мне нужно использовать пессимистическую блокировку для корректной работы?
Также, если я открою кэш второго уровня с распределенным в памяти кэшем (Redis, hazelcast), что произойдет?
Это проект IOT, и миллионы устройств вызывают этот API и сервис. Нужно ли мне подходить с возможной согласованностью?
Комментарии:
1. Вы используете терминологию многопоточности для описания транзакций базы данных, что сбивает с толку. Это не состояние гонки, это просто транзакция, которая может завершиться с ошибкой при оптимистичной блокировке. Затем вам нужно будет как-то с этим справиться (например, повторить неудачную транзакцию). Вы можете использовать пессимистическую блокировку, но возможно, что оптимистическая блокировка все же лучше, если транзакции не завершаются слишком часто.
2. Как насчет того, если я открою кэш второго уровня для кэширования запросов? Возможно ли снизить производительность запроса select? Но это часто меняется. Мне нужно реализовать кэш, который обрабатывает определенные функции. Также это архитектура микросервиса, поэтому я не могу действительно полагаться на общую транзакцию. Даже если я использую шаблон saga, чтобы контролировать транзакцию. Все еще слишком много дел :).
3. Я думаю, мне нужно выполнить нагрузочный тест. Я могу работать с Jmeter с облачными компьютерами. (Возможно, Aws или Azure)
4. Я думаю, может быть, возможно. Время покажет, это зависит от вас.