如何使用数组方法通过RMI从数据库的表中获取完整的数据?
Posted
技术标签:
【中文标题】如何使用数组方法通过RMI从数据库的表中获取完整的数据?【英文标题】:How to fetch complete data from the database's table through RMI using the array method? 【发布时间】: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
pst
和 rst
已声明但从未使用过。为什么将getArray
作为static
方法,为什么还要麻烦接口它?
连接、语句和结果集永远不会关闭。 JOptionPane 用于服务器端显示错误消息。
参考Java doc for Scope of variables
【参考方案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来确保ResultSet
、Statement
和Connection
都是关闭的。
【讨论】:
以上是关于如何使用数组方法通过RMI从数据库的表中获取完整的数据?的主要内容,如果未能解决你的问题,请参考以下文章