gpt4 book ai didi

java - 在多线程 RMI 架构中使用 JPA

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:28 28 4
gpt4 key购买 nike

我正在为不同的 Java 客户端设计一个基于 RMI 的数据服务服务器。客户端使用RMI远程进行CRUD操作,服务器的ORM我打算使用JPA。

据我所知,某些 RMI 请求实现是线程安全的,因此我计划使用 @PersistenceContext 注入(inject) EntityManager。我有两个问题。

  1. spring 是否使 EntityManager 注入(inject)线程安全,或者我应该注入(inject) EntityManagerFactory 并在必要时调用 createEntityManager
  2. 在保证方法代码是线程安全的情况下,我还需要确保同步吗?

根据RMI规范

  1. 当一个远程请求进来时,它立即被解码到一个请求对象中封装了方法调用。这个请求对象,它是一个实例实现 RemoteCall 接口(interface)的类,具有对套接字输出的引用溪流。这意味着,尽管 RMI 共享套接字,但一个套接字仅供一个人使用一次远程方法调用。
  2. 从套接字接收到请求的线程找到预期的远程对象方法调用,找到与该远程对象关联的骨架,并调用该骨架的 dispatch() 方法。调度方法具有以下签名:
  3. public void dispatch(java.rmi.Remote obj,java.rmi.server.RemoteCall 调用,intopnum, long hash) 抛出 java.lang.Exception
  4. 骨架的 dispatch() 方法调用服务器上的正确方法。这是您编写的代码实际执行的位置。
  5. 服务器方法返回一个值,该值最终通过接收原始请求的套接字。

我认为流程定义表明我们的代码可以在 RMI 环境中创建许多独立的调用堆栈。因此,RMI 要求代码是线程安全的,对吗?

最佳答案

当您通过 RMI 导出对象时,它必须处理多个线程,即使该对象只有一个客户端也是如此。原因如下:创建远程对象的线程肯定不同于处理远程调用的线程。

因此,如果您在创建远程对象期间注入(inject) EntityManager,它将被注入(inject)到与它在远程调用期间使用的线程不同的线程上。但是,EntityManager 只能在单个线程上使用,更具体地说,只能在创建它的线程上使用。例如,对于 Hibernate,您的 EntityManager 将无法工作,除非是这种情况。

因此您必须使用 EntityManagerFactory 来按需创建 EntityManager。为了尽量减少 EntityManager 创建,您可以将 EntityManager 存储在 ThreadLocal 中。

关于java - 在多线程 RMI 架构中使用 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130848/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com