Как безопасно внедрить entitymanager в bean-компонент ApplicationScoped в quarkus? - PullRequest
1 голос
/ 05 февраля 2020

В примерах quarkus я вижу, что компонент ApplicationScoped используется в качестве класса обслуживания с внедрением EntityManager. Как я знаю (JEE) EntityManager не является потокобезопасным, и бины ApplicationScoped также нет. Похоже, что мы разделяем один и тот же менеджер сущностей между запросами, если мы внедряем менеджер сущностей в компонент ApplicationScoped. Если компонент ApplicationScoped является потокобезопасным, тогда мы можем принять только один запрос одновременно. Я не могу понять, почему мы используем ApplicationScoped вместо компонентов RequestScoped с внедрением EntityManager.

1 Ответ

2 голосов
/ 06 февраля 2020

Как вы можете увидеть , Quarkus, как и другие проекты, работающие с конструкциями JPA, делает многое за кулисами, чтобы убедиться, что контекстная ссылка, которую вы, как конечный пользователь, получаете, ведет себя безопасно и

(Отказ от ответственности: я не эксперт Quarkus, но этот конкретный шаблон делегирования операций EntityManager различным базовым делегатам EntityManager в зависимости от статусов транзакций, связанных с синхронизацией и других проблем является общим для всех серверы приложений, которые были до этого.)

Внедрение так называемых «управляемых контейнером» EntityManager, которые ведут себя так, как люди интуитивно ожидают от них, достаточно сложно. Вы правы, чтобы быть осторожным как конечный пользователь в этой области: действительно, EntityManager, который вы получаете от EntityManagerFactory#createEntityManager(), не является потокобезопасным. Но это не то, что вводится в такие слоты. Например, EntityManager, введенные таким образом, будут выполнять другие захватывающие вещи, такие как автоматическое участие в транзакциях JTA, и эти транзакции по своей природе определяются потоком c, поэтому должна быть обеспечена некоторая степень безопасности потока - и так и так далее. Очевидно, что здесь происходит нечто большее, чем простое внедрение управляемой приложением EntityManager.

. Вывод: ссылка EntityManager, которую получает компонент ApplicationScoped, предоставляется таким образом, что это потокобезопасно.

...