result确实是非序列化的,你可以用rowset ,到sun的网站找找 rowset的包里面就有你需要的.

解决方案 »

  1.   

    多谢楼上的大哥。
    可是我不需要将result返回给客户端,所有的运行结果我都转换成自己的对象返回了。
    问题的根源是connection 不是序列化的,运行时出错。从而导致rmi服务失败。
    难道没有人能解决我的问题吗?
      

  2.   

    你有没有确认rmi取出数据有没有异常???
      

  3.   

    To Mars_Mao(战神)
    绑定rmi服务时出错,告诉我connection 没有序列化,在程序中connection 没有作为对外的公有属性,也没有作为参数。
      

  4.   

    反编译oracle的connection类,把它修改为implements Serializable,推荐的反编译工具:JAD, 改后的connection类加入到环境中编译,完了后重新打入jar包。试试看。
      

  5.   

    To Joeblackyang(野Heart)
    我需要为n个子系统提供数据服务,作为函数的变量好像不实际。不可能在每个函数内连一次数据库吧。efly(易飞) :
    你的办法我会作为最后一种方法是一下的、。多谢两位捧场!
      

  6.   

    小弟不明白
    干吗要把connection对象传来传去?
      

  7.   

    除了反编译connection以外,你可以试试找一下最新的connection。
    我觉得像这种可扩展性的问题不应该存留在后续的oracle的版本中。
      

  8.   

    Send me your code, I'll see it.
      

  9.   

    楼上的大哥留下你的email给我。
      

  10.   

    你重新包装的Result的有问题,你应该直接把JDBC中的Result的内容都读取后自己生成可以序列化的结果集,断开connect就可以了
      

  11.   

    做一个ConnectionFactory类,每次在函数中调用它从连接池中取一个connection,这样既不会有序列化错误,也不会每次都生成一个connection.
      

  12.   

    我的意思就是生成了自己的对象,自己的类当然要写成可序列化的了。connection是不能断开的,我要随时提供服务阿。不可能有请求再连接吧。
      

  13.   

    Joeblackyang(野Heart)
    作ConnectionFactory类同样存在序列化问题,ConnectionFactory中同样要用到Connection。其实ConnectionFactory只是封装了connection而已,我做过类似的实验。
      

  14.   

    不会吧,我的意思是你在函数中调用ConnectionFactory类,相当于静态方法,怎么会存在序列化的问题呢?
      

  15.   

    Joeblackyang(野Heart)
    我不太明白你的意思啊。
      

  16.   

    既然在服务器端操作数据库,这样拿出来的结果自己报装成序列化的对象,肯定在rmi中可以传输的,我以前做过。
      

  17.   

    //封装connection的类package test;import java.sql.*;public class oracleTest implements java.io.Serializable   {private Connection conn =null;  public oracleTest() {
        try{
          Class.forName("oracle.jdbc.driver.OracleDriver");
          this.conn  = DriverManager.getConnection("jdbc:oracle:thin:@202.98.98.13:1521:ORCL","cl8800" , "cl8800");
        }catch(Exception e){e.printStackTrace() ;};  }  
    }//rmi接口
    package test;import java.rmi.*;public interface testInterface extends java.rmi.Remote ,java.io.Serializable{  public void test() throws java.rmi.RemoteException ;}
    //rmi服务端程序
    package test;import java.rmi.*;public class rmiserver implements testInterface{
      oracleTest tt =null;
      public rmiserver() {
      try{
        tt= new oracleTest();
        Naming.bind("rmi://202.98.98.188/test",this);
      }catch(Exception e){e.printStackTrace();}
      }  public void test()
      {
      tt.test() ;
      }  public static void main(String[] args)
      {
        new rmiserver();
      }
    }//rmi客户端程序
    package test;import java.rmi.*;public class testrmiclient {  public testrmiclient() {
      try{
        testInterface tt = (testInterface)Naming.lookup("rmi://202.98.98.188/test") ;
        tt.test() ;
      }catch(Exception e){e.printStackTrace() ;}
      }  public static void main(String[] args)
      {
        new testrmiclient();
      }
    }原来的代码太大,这是一个测试代码,基本上相同。编译不出错,运行则会报错。
      

  18.   

    pengfei(peng) 
    我没有用Application server阿。
      

  19.   

    为什么你写的好像和你想实现的不一致啊?你不是说数据库操作放在服务器端嘛,既然用了RMI我觉得就不应该将conn给客户端,打个比方客户端需要查询某些数据,你可以先在客户端的程序将sql语句拼装起来,只将语句传到服务器端,然后在服务器端与数据库打交道,并将执行的结果封装成一个Serializable对象,将这个对象返回给客户端,这样的思路应该不会报错的啊!
      

  20.   

    ericsome(GzEric) 
    仔细看一下,我哪里有将connection给客户端啊。哦oracleTest,testInterface和rmiserver都是放在服务端的。而且我做的和你说的一样啊。
    我也觉得思路是对的,编译也可以通过,运行出错!。
      

  21.   

    我的意思是你的oracleTest类写成类似下面的形式:package test;import java.sql.*;public class oracleTest implements java.io.Serializable   {  public oracleTest() {
        try{
           Connection conn = ConnectionFactory.getConnection();
        }catch(Exception e){e.printStackTrace() ;};  }  
    }这样的话,首先conn不是类的成员变量,不会有序列化错误,
    其次,ConnectionFactory的getConnection()方法你可以做成
    从连接池中取Connection实例,不会是每次都新建一个Connection.
      

  22.   

    我试过了,Connection是不能被当作序列化对象来传的。当使用oracle连接时,得到的connection实际上的引址是 java.jdbc.OracleConnection 的对象引址。当我把它序列化后,这个类将通过,但是其它的的类又报没有序列化的错误!要一直溯源到像在java基础类中没有序列化的类,比如InputStream,Reader。所以想要使用rmi或者是ejb来传Connection是不可能做到的。而实际上这种思想是超出了分布式多层结构体系的设计范畴的。
      

  23.   

    既然Connection不用来给客户端,我不明白你为什么还要序列化
      

  24.   

    你把oracleTest类及方法改为静态的,这样你就不用实例化它了,直接在服务器的test方法里调用oracleTest.test()就可以了,这样oracleTest 就不是RmiServer的类成员了,也就不需要传过去了。
    行不行我也不能确定,自己试一下吧。
    和 Joeblackyang(野Heart) 的思路差不多。
      

  25.   

    各位大哥:
    谢谢大家捧场。
    我的实际目的是做一个数据远程服务的程序,运行在数据库服务器端。其他机器上的子系统连接这个服务程序获取他们所需要的数据,而不用每个都去连接数据库。
    我尝试用rmi做远程服务但没有成功(再次强调我没有将java.sql.中的任何类的对象传回客户端),所以来此请教大家怎么做。
    如果不能用rmi,还有什么办法?用socket好像太麻烦了吧?
      

  26.   

    ???
    你的rmiserver 好象没有extends UnicastRemoteObject, 也不是Activable.
    怎么export啊?
    Remote 对象也不需要implements Serializable啊。
      

  27.   

    你还可以用Web Service, 一样可以实现。
      

  28.   

    可能应该写一个和rmi完全隔离开的包来访问数据库,另一个包得到结果,处理rmi相关的事宜。
      

  29.   

    rmi处理来的请求,把其他数据库操作装在一个包里,返回结果
      

  30.   

    楼上二位说的对极,看来PEgirl(曾经)只是一个新手,还很不聪明。我以前没有用过rmi,但是我昨天下午查了一下资料,就把rmi弄通了,而且我发现PEgirl(不知道是不是男的)的程序很不规范。
      

  31.   

    efly(易飞) 
    首先声明我是个实实在在的girl,在java方面也是个新手,也不聪明.
    rmi本身也很简单,我也没有专门花钱到哪里培训这方面的知识。
    只是楼上几位大哥有没有看看我的问题???
    数据库封装有什么用,一样出问题,我贴上来的代码就是封装了connection的。
    先试验一下再回答我的问题好不好???如果我够高手的话也不用来这里提问了。
      

  32.   

    封装connection的类中声明 
    private Connection conn =null;
    改为:
    private transient Connection conn =null;
      

  33.   

    上面的方法更可笑,别人girl要的就是connection,而你却把它弄掉了:-}
      

  34.   

    already told you. little girl.class rmiserver extends UnicastRemoteObject{
    ......
    }then everything should be ok.
      

  35.   

    我正要问问
    UnicastRemoteObject和java.rmi.server.RemoteServer是什么东西呢??
      

  36.   

    To ajoo(聪明的一猪) 
    extends UnicastRemoteObject了也没用。
    贴上来前简化了一下程序,没想到弄错了。其实很简单,哪位高手大哥如果用的也是oracle数据库,把我的代码copy下去试验一下不就知道了吗?
      

  37.   

    继承了Remote的类的对象在返回到客户端时只是返回了它的Stub对象,原来的对象还是留在服务端的。所以这个Connection对象实际也是留在了服务器端,客户端根本没有Connection对象。
    我对你的意思的理解是:你想在此服务器维护一个连接池,其他需要连接数据库的客户从这个连接池中取出一个Connection对象,然后客户用此Connection对象直接连接数据库服务器?这是不行的,应为Connection只是一个接口,它的实现是与供应商相关的,而且各个数据库的连接方式不一样,如oracle是用socket连接的,所以它的Connection实现可能包括了一个socket对象,因为socket对象跟ip有关,所以其他电脑就算得到一个socket对象的副本也是不能与数据库连接的
      

  38.   

    我的意思是所有的数据库操作在服务端,我要把操作结果返回客户端。
    客户端和服务端肯定不在一台机器上,所以需要将服务端做成远程服务。我的问题的重点在于如何做成远程服务。我想将它做成rmi服务,但是由于connection的原因没有成功。还有什么办法?????
      

  39.   

    Connection跟rmi根本没关系,也互不冲突。你肯定是没弄对。
    你为什么要让testInterface implements Serializable?
    Remote对象根本就不必Serializable. 只有要传到客户端的对象才要Serializable.
    你声明rmiserver是Serializable的,这就等于要求它的所有成员都是Serializable的,而Connection很自然的不是Serializable的,当然不对啦。你明不明白自己在做什么呀?rmi虽说不难,但连基本的道理还没搞清楚就写程序,不是要命吗?还是找个tutorial仔细看一下rmi的程序应该怎么做吧。
    或者,先不管什么rmi, 只实现功能。实现了之后,做remote server只是小菜一碟,写个wrapper就ok了。你这简化了的代码, 连最关键的extends UnicastRemoteObject都漏了,还不定漏了什么了呢,怎么试啊?
      

  40.   

    没appserver?有webserver吧?通过servlet之间的通信来实现
    机器a为子系统,机器b为数据服务
    所有的数据处理在b上进行
    a将sql语句传到b,如果是查询,b得到结果集,并且将ResultSet转化成可序列化的对象,放在这个时候已经存在的a和b之间的session中,b然后通知a,a从session中取值,断开session另外每一次数据服务处理完毕关掉连接!!!资源宝贵,你还可以写一个(找一个)数据库连接的连接池来优化连接