Java RMI-我没弄错吧?

Java RMI-我没弄错吧?,java,rmi,Java,Rmi,有人能验证我是否正确理解java RMI吗 如果我有: public class Server extends UnicastRemoteObject { public Server() throws RemoteException { super(); if (System.getSecurityManager() == null) { System.setSecurityManager(new RMIS

有人能验证我是否正确理解java RMI吗

如果我有:

public class Server extends UnicastRemoteObject 
{
    public Server() throws RemoteException
    {
        super();
        if (System.getSecurityManager() == null)
        {
            System.setSecurityManager(new RMISecurityManager());
        }
        try
        {
            Naming.rebind("rmi://someAddress/someName" , this);
        }
        catch (MalformedURLException ex)
        {
        }
        catch (ConnectException ex)
        {
        }

/* do sometnig else there */
   }
}

这是否意味着,如果100个客户端连接,RMI将创建该服务器的100个副本作为线程,以方便这些客户端(无需我进一步干预)

否,如果连接了100个客户端,RMI注册表将管理多个单独的线程,这些线程都是针对
服务器
类的单个实例执行的

最有可能的是,每个客户端连接都会产生一个新线程,可能是多个线程,但永远不会创建
Server
的新实例

这是否意味着,如果100个客户端连接,RMI将创建该服务器的100个副本作为线程,以方便这些客户端(无需我进一步干预)


没有“创建100个作为线程的服务器副本”这样的事情。您可以创建服务器的任何实例,RMI创建调用服务器方法所需的线程数。服务器中所需的任何同步都由您决定。

因此,如果客户端连接了服务器线程,我必须创建新的服务器线程,并使用不同的名称重新绑定它,以处理每个客户端请求?@oO:不,这是为您完成的。只需确保
服务器
类是线程安全的。你不需要自己管理实例或线程。还有一个问题:如果我的服务器只连接到mysql和连接的客户端,那么它应该是线程安全的?RMI注册表根本不管理线程。在绑定/查找阶段之后,它不参与RMI@面向对象。不。任何需要的同步都取决于你。这是一个学术问题吗?或者你想解决什么问题?RMI的水平相当低。如果您想在项目中使用基于RMI的技术,则考虑使用EJB 3。java(Java EE 5/6)。应用程序服务器将为您解决很多问题。我从RMI开始,我担心更改可能会太晚,但这是一个技巧。EJB是基于RMI构建的,因此您可以重用很多东西。直接使用RMI需要您确保正确的东西是线程安全的,这是非常重要的,并且可能比切换到EJB花费更多。当使用EJB并遵循一些简单的原则时,这些线程问题中的许多都会为您解决。您还可以从javaee堆栈的所有其他部分中获益,这可能比切换到javaee的成本更安全。除非这是一个非常小的锻炼项目。嗯,对我来说,它相当大。再加上看到EJB规范有500多页长,我可能没有足够的时间。