1.3.1 远程接口定义
public interface Application extends Remote { //------------------------------------------------------------------------- //Get data source by data source name public Connection getConnection() throws RemoteException;
1.3.2 服务端执行类的核心代码
final String connectStr = "jdbc:mysql://localhost/phome"; final String userName = "root"; …… if( (conn = FoolDB.openDB(connectStr, userName, passwd)) == null) ……
但是当执行客户端时,提示com.mysql.jdbc.SingleByteCharsetConverter不支持序列化的错误。虽然提供的只是Connection接口,但是RMI对Connection的解析已经进入到JDBC驱动内部,只要与Connection接口相关的所有的类都要进行是否序列化检查。所以这里以Connection为参数也时行不通。
1.4 实践过程3──以ResultSet作为远程接口函数返回值
同样的以ResultSet作为远程接口函数返回值,提示com.mysql.jdbc.JDBC4ResultSet不支持序列化的错误。所以这里以ResultSet为参数也时行不通。
1.5 摸索小结
通过上述实践,我们可以逐步对远程接口返回值是否支持序列化产生一个概念,只有当类实体或者父类实体支持序列化时,该对象才可能支持序列化。上述DataSouce,Connection和ResultSet都是只是接口。这里父接口支持序列化是没有多大意义的。
另外的一个问题,如果ResultSet类不能作为远程接口函数返回值,那么我们如何实现数据集的返回呢?难道由我们自定义返回值接口?
经过从很多应用资料中进行调查和推敲,RMI应用都没有使用Connection或者更高层的返回值,不仅出于复杂度,而且还出于系统安全性和集中控制考虑,都是采用自定义数据返回类型!有的应用干脆采用Vector容器拷贝。
在接下来的实践中,我们通过了嵌套ArrayList容器来自定义结果集类,当然,该类必须继承序列化类,才能保证其可以通过序列化机制拷贝。