技术开发 频道

RMI进阶篇:实现Multi-Tier框架

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容器来自定义结果集类,当然,该类必须继承序列化类,才能保证其可以通过序列化机制拷贝。

0
相关文章