比如客户端建立很多远程对象,这些远程对象是否公用一个套接字和一个输出输入流,还是每个远程有其自己的套接字?另外,服务器端收到方法调用请求后,是否使用反射来进行相应的方法调用?目前接到一个任务,主要是编写jdbc类型三驱动程序,想用rmi,但是这个驱动程序对性能有很高要求。

解决方案 »

  1.   

    个人认为RMI效率无法满足你的要求,传输的都是序列化的对象,两边还要序列化、反序列化。
    还有一个问题就是你的JDBC上可能会传输大规模的数据集,简单的通过RMI实现,很容易OOM的。
      

  2.   

    书上说了,RMI是Socket实现的,但是往往比Socket的效率高。
      

  3.   

    公共的。是使用反射。
    驱动这个东东,我的建议还是用JNI吧。C++实现socket以及rpc,提供API,供JAVA调用。
      

  4.   

    曾经做过一个JDK内部提供的RMI的例子,其实内部还是用Socket来实现的,还需要JDK的Dynamic Proxy,JDK的动态代理就必须要接口
    RMI应该还有别的实现,不妨看看类似的像EJOE这样的序列化和反序列化组件
      

  5.   

    我记得 rmi 好像是 三点式的吧?   是由  client/server/registerCenter  三部分构成的吧!?  也就是说你打算让你的这个驱动程序还配置一个 注册服务器?   或者说你想把你的 数据库干脆发布成一个webservice ?jdbc 实现的应该是两点! 另外如果你想传输效率高 并且传输java对象的话!   你可以编写自己的序列化(对于特定对象)程序啊! 
      

  6.   

    关于动态代理和反射的性能呢?网上说很差啊!驱动实现的总体结构是在应用服务器和数据库服务器之间插入一个代理服务器,应用服务器将数据库调用方法发送到代理服务器,代理服务器通过反射执行方法,然后将结果返回给应用服务器。怕的是使用反射和动态代理的性能问题啊!代理服务器是要执行大量的方法调用的,(一个代理服务器可能连接一个或者多个应用服务器,应用服务器是与电力行业密切相关的,很重要),全部用反射,行吗? 我就是怕这个啊!不行的话,必须使用javasisst了。
      

  7.   

    答:
    1)早期的RPC(如:基于C语言的RPC库),都是基于UDP实现的。为提高可靠性,在JAVA中的RMI是基于TCP实现的。在JDK1.5版本及之后,基于动态代理实现。在jdk1.4或之前,是要求在客户端手工用rmic来生成客户方的代理程序代码的。双方通信是通过生成的代码程序代码来进行的。而代理代码正是基于反射机制进行相应的方法调用的。
    使用RMI需要进行正确的安全设置(即:策略文件中进行授权)与部署。因此:在使用RMI时,除了RMI服务器方代码、RMI客户机方代码、registry方(注册方。当然可用服务器方本地的Registry。),还需要一个Web Server,它的作用是:用于你的RMI应用系统在运行时可能需要的其它class文件,这些.class可通过该WebServer,通过RMI的类装载机制,自动进行下载,因而RMI应用系统需要进行部署。2)你的任务是:JDBC的第三类驱动,性能要求很高,我认为基于RMI的方案不是一个很合适的方案。以上仅供你参考