Как получить полные данные из таблицы базы данных через RMI с помощью метода массива?

0

Вопрос

Я хочу получить полные данные из таблицы базы данных через 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.
    }
}
java rmi
2021-11-24 05:53:25
1

Лучший ответ

0

Абстрактные методы в удаленных интерфейсах не могут быть статическими, поэтому вам необходимо изменить определение интерфейса на следующее.

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

Значения, возвращаемые удаленными методами, должны быть сериализуемыми. Массивы в java сериализуемы, однако массивы имеют фиксированный размер, и поскольку вы возвращаете результат запроса к базе данных, вы не можете знать размер. Поэтому я предлагаю этот метод getArray верните ArrayList или, еще лучше, CachedRowSet.

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

С занятий TheImplementation является ли ваш сервер RMI классом, вероятно, лучше регистрировать исключения, а не отображать JOptionPane и вы всегда должны регистрировать трассировку стека. Обратите внимание, что удаленные методы должны объявить, что они выбрасывают 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);
        }
    }
}

Обратите внимание, что в приведенном выше коде также используется функция "попробуйте с ресурсами", чтобы гарантировать, что ResultSet, Statement и Connection все они закрыты.

2021-11-24 08:26:23

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................