【问题标题】:How to fetch complete data from the database's table through RMI using the array method?如何使用数组方法通过RMI从数据库的表中获取完整的数据?
【发布时间】:2022-01-02 13:28:34
【问题描述】:

我想通过 RMI 从数据库的表中获取完整的数据。我在 Java 接口中使用了数组方法,并在实现类中实现了该方法。我的意图是通过实现获取数组中的数据,并在客户端通过JTable 显示它。我在数据库中创建了一个单列表。我必须将整个数据从该表获取到客户端。

我附上了我所做的编码。 我已经在我得到的代码部分注释了错误。

界面

public interface Interface extends Remote {
     public static String[] getArray() throws Remote Exception; // Here it shows missing method 
                                                               //  body or declare abstract
}

实施

public class TheImplementation extends UnicastRemoteObject implements Interface{
    
    public TheImplementation()throws Remote Exception{
        super();
    }
    
    private static final long serialVersionUID = -3763231206310559L;
    
    Connection con;
    PreparedStatement pst;
    ResultSet rst;

    public static String[] getArray() throws RemoteException{
        String fruitdetails = null; 
        try {
            Connection connection=ConnectionProvider.getConnection();
            Statement st=connection.createStatement();
            ResultSet rs=st.executeQuery("select *from details");
            while(rs.next()) { 
                fruitdetails= rs.getString("fruit");
                String tbData[]={fruitdetails};
            }
        }
        catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e);
        }
        return tbData;// Here it shows error. Cannot find symbol.
                           // I tried to declare array at top. But, It didn't work.
    }
}

【问题讨论】:

  • tbData 是在 while 循环中声明的,所以它的作用域只在 while 循环内。当你编译它时,你的 sql 会抛出一个错误。其他 Interface 不是 Java 对象的好名字。 con pstrst 已声明但从未使用过。为什么将getArray 作为static 方法,为什么还要麻烦接口它?
  • 连接、语句和结果集永远不会关闭。 JOptionPane 用于服务器端显示错误消息。

标签: java rmi


【解决方案1】:

remote interfaces中的抽象方法不能是静态的,所以需要将接口定义改成如下。

public interface Interface extends java.rmi.Remote {
    public String[] getArray() throws RemoteException;
}

远程方法返回的值必须是serializable。 java中的数组是可序列化的,但是数组具有固定的大小,并且由于您正在返回数据库查询的结果,因此您无法知道大小。因此我建议getArray 方法返回一个ArrayList 或更好的CachedRowSet

public interface Interface extends Remote {
    public CachedRowSet getArray() throws RemoteException;
}

由于类TheImplementation 是您的RMI 服务器类,因此最好使用log 异常而不是显示JOptionPane,并且您应该始终记录stack trace。请注意,远程方法必须声明它们抛出RemoteException,以便通知RMI 客户端远程方法失败。因此,除了记录异常之外,方法getArray 还可以抛出RemoteException

以下代码演示。

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

public class TheImplementation extends UnicastRemoteObject implements Interface {

    public TheImplementation() throws RemoteException {
        super();
    }

    private static final long serialVersionUID = -3763231206310559L;

    public CachedRowSet getArray() throws RemoteException {
        try (Connection con = ConnectionProvider.getConnection();
             Statement st = con.createStatement();
             ResultSet rs = st.executeQuery("select * from details")) {
            RowSetFactory factory = RowSetProvider.newFactory();
            CachedRowSet fruitDetails = factory.createCachedRowSet();
            fruitDetails.populate(rs);
            return fruitDetails;
        }
        catch (SQLException e) {
            throw new RemoteException("Method 'getArray()' failed.", e);
        }
    }
}

请注意,上面的代码还使用了try-with-resources来确保ResultSetStatementConnection都是关闭的。

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 2015-07-31
    • 2012-02-29
    • 1970-01-01
    • 2016-01-15
    • 2019-12-23
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多