500分求解决方案 result确实是非序列化的,你可以用rowset ,到sun的网站找找 rowset的包里面就有你需要的. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多谢楼上的大哥。可是我不需要将result返回给客户端,所有的运行结果我都转换成自己的对象返回了。问题的根源是connection 不是序列化的,运行时出错。从而导致rmi服务失败。难道没有人能解决我的问题吗? 你有没有确认rmi取出数据有没有异常??? To Mars_Mao(战神)绑定rmi服务时出错,告诉我connection 没有序列化,在程序中connection 没有作为对外的公有属性,也没有作为参数。 反编译oracle的connection类,把它修改为implements Serializable,推荐的反编译工具:JAD, 改后的connection类加入到环境中编译,完了后重新打入jar包。试试看。 To Joeblackyang(野Heart)我需要为n个子系统提供数据服务,作为函数的变量好像不实际。不可能在每个函数内连一次数据库吧。efly(易飞) :你的办法我会作为最后一种方法是一下的、。多谢两位捧场! 小弟不明白干吗要把connection对象传来传去? 除了反编译connection以外,你可以试试找一下最新的connection。我觉得像这种可扩展性的问题不应该存留在后续的oracle的版本中。 Send me your code, I'll see it. 楼上的大哥留下你的email给我。 你重新包装的Result的有问题,你应该直接把JDBC中的Result的内容都读取后自己生成可以序列化的结果集,断开connect就可以了 做一个ConnectionFactory类,每次在函数中调用它从连接池中取一个connection,这样既不会有序列化错误,也不会每次都生成一个connection. 我的意思就是生成了自己的对象,自己的类当然要写成可序列化的了。connection是不能断开的,我要随时提供服务阿。不可能有请求再连接吧。 Joeblackyang(野Heart)作ConnectionFactory类同样存在序列化问题,ConnectionFactory中同样要用到Connection。其实ConnectionFactory只是封装了connection而已,我做过类似的实验。 不会吧,我的意思是你在函数中调用ConnectionFactory类,相当于静态方法,怎么会存在序列化的问题呢? Joeblackyang(野Heart)我不太明白你的意思啊。 既然在服务器端操作数据库,这样拿出来的结果自己报装成序列化的对象,肯定在rmi中可以传输的,我以前做过。 //封装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(); }}原来的代码太大,这是一个测试代码,基本上相同。编译不出错,运行则会报错。 pengfei(peng) 我没有用Application server阿。 为什么你写的好像和你想实现的不一致啊?你不是说数据库操作放在服务器端嘛,既然用了RMI我觉得就不应该将conn给客户端,打个比方客户端需要查询某些数据,你可以先在客户端的程序将sql语句拼装起来,只将语句传到服务器端,然后在服务器端与数据库打交道,并将执行的结果封装成一个Serializable对象,将这个对象返回给客户端,这样的思路应该不会报错的啊! ericsome(GzEric) 仔细看一下,我哪里有将connection给客户端啊。哦oracleTest,testInterface和rmiserver都是放在服务端的。而且我做的和你说的一样啊。我也觉得思路是对的,编译也可以通过,运行出错!。 我的意思是你的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. 我试过了,Connection是不能被当作序列化对象来传的。当使用oracle连接时,得到的connection实际上的引址是 java.jdbc.OracleConnection 的对象引址。当我把它序列化后,这个类将通过,但是其它的的类又报没有序列化的错误!要一直溯源到像在java基础类中没有序列化的类,比如InputStream,Reader。所以想要使用rmi或者是ejb来传Connection是不可能做到的。而实际上这种思想是超出了分布式多层结构体系的设计范畴的。 既然Connection不用来给客户端,我不明白你为什么还要序列化 你把oracleTest类及方法改为静态的,这样你就不用实例化它了,直接在服务器的test方法里调用oracleTest.test()就可以了,这样oracleTest 就不是RmiServer的类成员了,也就不需要传过去了。行不行我也不能确定,自己试一下吧。和 Joeblackyang(野Heart) 的思路差不多。 各位大哥:谢谢大家捧场。我的实际目的是做一个数据远程服务的程序,运行在数据库服务器端。其他机器上的子系统连接这个服务程序获取他们所需要的数据,而不用每个都去连接数据库。我尝试用rmi做远程服务但没有成功(再次强调我没有将java.sql.中的任何类的对象传回客户端),所以来此请教大家怎么做。如果不能用rmi,还有什么办法?用socket好像太麻烦了吧? ???你的rmiserver 好象没有extends UnicastRemoteObject, 也不是Activable.怎么export啊?Remote 对象也不需要implements Serializable啊。 你还可以用Web Service, 一样可以实现。 可能应该写一个和rmi完全隔离开的包来访问数据库,另一个包得到结果,处理rmi相关的事宜。 rmi处理来的请求,把其他数据库操作装在一个包里,返回结果 楼上二位说的对极,看来PEgirl(曾经)只是一个新手,还很不聪明。我以前没有用过rmi,但是我昨天下午查了一下资料,就把rmi弄通了,而且我发现PEgirl(不知道是不是男的)的程序很不规范。 efly(易飞) 首先声明我是个实实在在的girl,在java方面也是个新手,也不聪明.rmi本身也很简单,我也没有专门花钱到哪里培训这方面的知识。只是楼上几位大哥有没有看看我的问题???数据库封装有什么用,一样出问题,我贴上来的代码就是封装了connection的。先试验一下再回答我的问题好不好???如果我够高手的话也不用来这里提问了。 封装connection的类中声明 private Connection conn =null;改为:private transient Connection conn =null; 上面的方法更可笑,别人girl要的就是connection,而你却把它弄掉了:-} already told you. little girl.class rmiserver extends UnicastRemoteObject{......}then everything should be ok. 我正要问问UnicastRemoteObject和java.rmi.server.RemoteServer是什么东西呢?? To ajoo(聪明的一猪) extends UnicastRemoteObject了也没用。贴上来前简化了一下程序,没想到弄错了。其实很简单,哪位高手大哥如果用的也是oracle数据库,把我的代码copy下去试验一下不就知道了吗? 继承了Remote的类的对象在返回到客户端时只是返回了它的Stub对象,原来的对象还是留在服务端的。所以这个Connection对象实际也是留在了服务器端,客户端根本没有Connection对象。我对你的意思的理解是:你想在此服务器维护一个连接池,其他需要连接数据库的客户从这个连接池中取出一个Connection对象,然后客户用此Connection对象直接连接数据库服务器?这是不行的,应为Connection只是一个接口,它的实现是与供应商相关的,而且各个数据库的连接方式不一样,如oracle是用socket连接的,所以它的Connection实现可能包括了一个socket对象,因为socket对象跟ip有关,所以其他电脑就算得到一个socket对象的副本也是不能与数据库连接的 我的意思是所有的数据库操作在服务端,我要把操作结果返回客户端。客户端和服务端肯定不在一台机器上,所以需要将服务端做成远程服务。我的问题的重点在于如何做成远程服务。我想将它做成rmi服务,但是由于connection的原因没有成功。还有什么办法????? Connection跟rmi根本没关系,也互不冲突。你肯定是没弄对。你为什么要让testInterface implements Serializable?Remote对象根本就不必Serializable. 只有要传到客户端的对象才要Serializable.你声明rmiserver是Serializable的,这就等于要求它的所有成员都是Serializable的,而Connection很自然的不是Serializable的,当然不对啦。你明不明白自己在做什么呀?rmi虽说不难,但连基本的道理还没搞清楚就写程序,不是要命吗?还是找个tutorial仔细看一下rmi的程序应该怎么做吧。或者,先不管什么rmi, 只实现功能。实现了之后,做remote server只是小菜一碟,写个wrapper就ok了。你这简化了的代码, 连最关键的extends UnicastRemoteObject都漏了,还不定漏了什么了呢,怎么试啊? 没appserver?有webserver吧?通过servlet之间的通信来实现机器a为子系统,机器b为数据服务所有的数据处理在b上进行a将sql语句传到b,如果是查询,b得到结果集,并且将ResultSet转化成可序列化的对象,放在这个时候已经存在的a和b之间的session中,b然后通知a,a从session中取值,断开session另外每一次数据服务处理完毕关掉连接!!!资源宝贵,你还可以写一个(找一个)数据库连接的连接池来优化连接 java项目路径及打包的问题 jDialog.dispose()不起作用 着急哇!如何获得wmv视频的播放时间? 关于Swing的几个问题,希望各位解答! 一个简单的JAVA问题 开始动手研究布局管理,呵呵,大家进来看看,给点我意见。谢谢! [求助]jbuilder8中如何用RetroGuard混淆器来混淆jar文件? 招聘启事 我想编程分析任意一个java文件,把其中的注释部分删掉,请帮我分析一下思路和方法好吗? Java能直接调用C++代码生成的DLL吗? jdbc连接DB2的问题,谢谢 关于jdbc的连接问题
可是我不需要将result返回给客户端,所有的运行结果我都转换成自己的对象返回了。
问题的根源是connection 不是序列化的,运行时出错。从而导致rmi服务失败。
难道没有人能解决我的问题吗?
绑定rmi服务时出错,告诉我connection 没有序列化,在程序中connection 没有作为对外的公有属性,也没有作为参数。
我需要为n个子系统提供数据服务,作为函数的变量好像不实际。不可能在每个函数内连一次数据库吧。efly(易飞) :
你的办法我会作为最后一种方法是一下的、。多谢两位捧场!
干吗要把connection对象传来传去?
我觉得像这种可扩展性的问题不应该存留在后续的oracle的版本中。
作ConnectionFactory类同样存在序列化问题,ConnectionFactory中同样要用到Connection。其实ConnectionFactory只是封装了connection而已,我做过类似的实验。
我不太明白你的意思啊。
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();
}
}原来的代码太大,这是一个测试代码,基本上相同。编译不出错,运行则会报错。
我没有用Application server阿。
仔细看一下,我哪里有将connection给客户端啊。哦oracleTest,testInterface和rmiserver都是放在服务端的。而且我做的和你说的一样啊。
我也觉得思路是对的,编译也可以通过,运行出错!。
try{
Connection conn = ConnectionFactory.getConnection();
}catch(Exception e){e.printStackTrace() ;}; }
}这样的话,首先conn不是类的成员变量,不会有序列化错误,
其次,ConnectionFactory的getConnection()方法你可以做成
从连接池中取Connection实例,不会是每次都新建一个Connection.
行不行我也不能确定,自己试一下吧。
和 Joeblackyang(野Heart) 的思路差不多。
谢谢大家捧场。
我的实际目的是做一个数据远程服务的程序,运行在数据库服务器端。其他机器上的子系统连接这个服务程序获取他们所需要的数据,而不用每个都去连接数据库。
我尝试用rmi做远程服务但没有成功(再次强调我没有将java.sql.中的任何类的对象传回客户端),所以来此请教大家怎么做。
如果不能用rmi,还有什么办法?用socket好像太麻烦了吧?
你的rmiserver 好象没有extends UnicastRemoteObject, 也不是Activable.
怎么export啊?
Remote 对象也不需要implements Serializable啊。
首先声明我是个实实在在的girl,在java方面也是个新手,也不聪明.
rmi本身也很简单,我也没有专门花钱到哪里培训这方面的知识。
只是楼上几位大哥有没有看看我的问题???
数据库封装有什么用,一样出问题,我贴上来的代码就是封装了connection的。
先试验一下再回答我的问题好不好???如果我够高手的话也不用来这里提问了。
private Connection conn =null;
改为:
private transient Connection conn =null;
......
}then everything should be ok.
UnicastRemoteObject和java.rmi.server.RemoteServer是什么东西呢??
extends UnicastRemoteObject了也没用。
贴上来前简化了一下程序,没想到弄错了。其实很简单,哪位高手大哥如果用的也是oracle数据库,把我的代码copy下去试验一下不就知道了吗?
我对你的意思的理解是:你想在此服务器维护一个连接池,其他需要连接数据库的客户从这个连接池中取出一个Connection对象,然后客户用此Connection对象直接连接数据库服务器?这是不行的,应为Connection只是一个接口,它的实现是与供应商相关的,而且各个数据库的连接方式不一样,如oracle是用socket连接的,所以它的Connection实现可能包括了一个socket对象,因为socket对象跟ip有关,所以其他电脑就算得到一个socket对象的副本也是不能与数据库连接的
客户端和服务端肯定不在一台机器上,所以需要将服务端做成远程服务。我的问题的重点在于如何做成远程服务。我想将它做成rmi服务,但是由于connection的原因没有成功。还有什么办法?????
你为什么要让testInterface implements Serializable?
Remote对象根本就不必Serializable. 只有要传到客户端的对象才要Serializable.
你声明rmiserver是Serializable的,这就等于要求它的所有成员都是Serializable的,而Connection很自然的不是Serializable的,当然不对啦。你明不明白自己在做什么呀?rmi虽说不难,但连基本的道理还没搞清楚就写程序,不是要命吗?还是找个tutorial仔细看一下rmi的程序应该怎么做吧。
或者,先不管什么rmi, 只实现功能。实现了之后,做remote server只是小菜一碟,写个wrapper就ok了。你这简化了的代码, 连最关键的extends UnicastRemoteObject都漏了,还不定漏了什么了呢,怎么试啊?
机器a为子系统,机器b为数据服务
所有的数据处理在b上进行
a将sql语句传到b,如果是查询,b得到结果集,并且将ResultSet转化成可序列化的对象,放在这个时候已经存在的a和b之间的session中,b然后通知a,a从session中取值,断开session另外每一次数据服务处理完毕关掉连接!!!资源宝贵,你还可以写一个(找一个)数据库连接的连接池来优化连接