Я проектирую сервер службы данных на основе RMI для разных Java-клиентов. Клиенты используют RMI для выполнения операций CRUD удаленно, и я планирую использовать JPA для ORM сервера.с использованием JPA в многопоточной архитектуре RMI
Как я знаю, некоторые запросы RMI требуют потокобезопасности, поэтому я планирую ввести EntityManager
, используя @PersistenceContext
. У меня есть два вопроса.
- ли весной сделать
EntityManager
впрыскивается поточно, или я должен вводитьEntityManagerFactory
и вызватьcreateEntityManager
при необходимости? - Должен ли я по-прежнему синхронизироваться, если код метода гарантированно является потокобезопасным?
В соответствии со спецификацией RMI
- Когда удаленный запрос приходит, он сразу же demarshalled в объект запроса, который инкапсулирует вызов метода. Этот объект запроса, являющийся экземпляром класса , реализующего интерфейс RemoteCall, имеет ссылку на выходной поток сокета . Это означает, что хотя RMI совместно использует сокеты, сокет используется только для одного вызова удаленных методов за раз.
- Поток, получивший запрос от сокета, находит целевой объект для вызова метода, находит скелет, связанный с этим удаленным объектом, и вызывает метод отправки скелета(). Способ доставки имеет следующую подпись:
- общественного недействительными отправка (java.rmi.Remote OBJ, java.rmi.server.RemoteCall вызова, внутр opnum, длинный хэш) бросает java.lang.Exception
- скелета Метод dispatch() вызывает правильный метод на сервере. Это , где код, который вы написали, фактически выполнен.
- Метод сервера возвращает значение, которое в конечном итоге распространяется через сокет , на котором был получен исходный запрос.
Я думаю, что определение процесса предполагает, что в среде RMI может быть создано множество разделов вызовов нашего кода. поэтому RMI требует, чтобы код был потокобезопасным, верно?
Вы определенно используете Spring? Если это так, вы можете добавить тег [tag: spring]. –
«Поскольку я знаю, что реализация RMI-запросов является потокобезопасной», я думаю, что вы имеете в виду, что RMI * не делает никаких гарантий в отношении потоковой передачи, и поэтому * требует, чтобы ваши реализации удаленных методов были потокобезопасными. Но это не то, что вы на самом деле сказали. – EJP
@TomAnderson tag изменен, спасибо – Korben