Jak uzyskać pełne dane z tabeli bazy danych przez RMI za pomocą metody tablicy?

0

Pytanie

Chcę uzyskać pełne dane z tabeli bazy danych przez RMI. Użyłem metody tablicy w interfejsie Java i wykorzystał tę metodę w klasie realizacji. Moją intencją jest, aby wziąć dane w tablicy za pomocą realizacji i pokazać je za pomocą JTable na stronie klienta. Stworzyłem tabelę z jedną kolumną w bazie danych. Powinienem dostać te wszystkie dane z tej tabeli na stronie klienta.

Włożyłem kodowanie, którą zrobiłem. Skomentował błąd w sekcji kodu, który otrzymałem.

interfejs

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

Realizacja

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

Najlepsza odpowiedź

0

Streszczenie metody w zdalnych interfejsów nie mogą być statyczne, więc trzeba zmienić definicję interfejsu na następujący.

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

Wartości zwracane przez zdalnymi metodami powinny być сериализуемыми. Tablice w języku java сериализуемы, jednak tablice mają stały rozmiar, a ponieważ zwracasz wynik zapytania do bazy danych, możesz nie wiedzieć rozmiar. Dlatego proponuję tę metodę getArray oddajcie ArrayList lub, jeszcze lepiej, CachedRowSet.

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

Z zajęć TheImplementation czy twój serwer RMI klasą, chyba lepiej rejestrować wyjątki, a nie wyświetla JOptionPane i zawsze należy rejestrować ślad stosu. Należy pamiętać, że usunięte metody muszą zadeklarować, że wyrzucają RemoteException aby poinformować klienta RMI, że zdalny metoda nie powiodło się. Dlatego, oprócz rejestracji wyjątki, metoda getArray można również wrzucić RemoteException.

Poniższy kod demonstruje.

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);
        }
    }
}

Należy zwrócić uwagę, że w powyższym kodzie jest również używana jest funkcja "spróbuj z zasobów", aby zagwarantować, że ResultSet, Statement i Connection wszystkie są zamknięte.

2021-11-24 08:26:23

W innych językach

Ta strona jest w innych językach

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