Avatar billede ladbye Nybegynder
13. maj 2007 - 12:31 Der er 10 kommentarer og
1 løsning

RMI & MySQL-Driver

Hej,

Jeg står med et program jeg har lavet, hvori jeg benytter mig af en række databaseopkald - som alle virker fint. Nu skal jeg have implementeret RMI ind i programmet, dog ikke nødvendigvis med SWING, men blot som noget der kan køres fra kommandopromten af.

Mit problem er nu, at jeg har fået lavet nogle filer ud fra eksempler fundet dels herinde og dels via google. Filerne er StudentServer, StudentServerImpl, StudentClient og Student. Jeg har lavet class-filer af samtlige og en _Stub af StudentServerImpl. Når jeg kører StudentServerImpl fra min Eclipse hvori jeg har programmeret det hele, så starter den serveren uden problemer, men forsøger jeg at afvikle den igennem kommandoprompten, melder den om en ClassNotFound-exception for com.mysql.jdbc.Driver.

Kildekoden til StudentServerImpl:
//////////////////////////////////////////////////////////////////
import java.rmi.*;
import java.rmi.server.*;
import java.sql.ResultSet;
import java.util.*;

public class StudentServerImpl extends UnicastRemoteObject implements StudentServer{
   
    private Student studentInformation;
    ManageDB sql = ManageDB.getInstance();
   
    public StudentServerImpl() throws RemoteException{
        super();
    }

    private void getStudentInformation(String ssn){
        try{
            System.err.println("Getting student information");
            Vector<Student> studentVector = new Vector<Student>();
            ResultSet row = sql.getData("*", "tennisschool.student", "SSN", ssn);
            while(row.next()){
                Student student = new Student(row.getString("SSN"), row.getString("Fname"), row.getString("Lname"), row.getString("Address"), row.getString("ZIP_Code"), row.getString("E_mail"), row.getString("Phone_number"), row.getString("Start_Date"), row.getString("Description"));
                studentVector.add(student);
            }
            System.err.println("Finished processing student information");
           
        }catch(Exception e){
            e.printStackTrace();
            System.exit( 1 );
        }
    }
   
    public String getStudentInfo(String ssn) throws RemoteException{
        getStudentInformation(ssn);
        String fname = studentInformation.getFName();
        String lname = studentInformation.getLName();
        String information = "Students Name: " + fname + " " + lname;
        return information;
    }
   
    public static void main(String args[]) throws Exception{
        System.err.println("Initialising server: please wait.");
        StudentServerImpl stud = new StudentServerImpl();
        String serverObjectName = "//localhost/StudentServer";
        Naming.rebind(serverObjectName, stud);
        System.out.println("The Student server is up and running.");
    }
}
//////////////////////////////////////////////////////////////////

Nogen forslag til hvordan jeg kan rette denne fejl?
Avatar billede arne_v Ekspert
13. maj 2007 - 16:58 #1
du skal starte den med MySQL driver jar filen i classpath
Avatar billede arne_v Ekspert
13. maj 2007 - 16:59 #2
java -cp .;C:\mysql\jdbc\mysql-jdbc-driver.jar MinRMIServer

ret selv til så den passer til din konfig
Avatar billede ladbye Nybegynder
13. maj 2007 - 17:51 #3
Jah, det løste sørme mit problem. Nu starter den fint op. Nu hvor du er her, kan det så være du kan hjælpe med det næste problem der er opstået. Når jeg kører min StudentClient melder den om en UnmarshalException og endvidere en NotSerializableException på den klasse (ManageDB) jeg bruger til at kalde op til min MySQL-server. Kan lige vedlægge koden:

StudentClient
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.rmi.*;
import java.util.Scanner;

public class StudentClient extends JFrame{
   
    public StudentClient(String ip){
        super("RMI StudentClient...");
        getRemoteStud(ip);
        setSize(300,300);
        setResizable(false);
        show();
    }
   
    private void getRemoteStud(String ip){
        Scanner keyB = new Scanner(System.in);
        try{
            String serverObjectName = "//" + ip + "/StudentServer";
            StudentServer mystud = (StudentServer)Naming.lookup(serverObjectName);
            String ssn = "ssn";
            while(ssn != "ssn"){
                System.out.print("Type SSN: ");
                ssn = keyB.next();
                String studentInfo = mystud.getStudentInfo(ssn);

                System.out.print(studentInfo);
            }
        }catch(java.rmi.ConnectException ce){
            System.err.println("Connection to server failed. Server may be temporarily unavailable.");
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
    }
   
    public static void main(String[] args){
        StudentClient client = null;
        if(args.length == 0)
            client = new StudentClient("localhost");
        else
            client = new StudentClient(args[0]);
       
        client.addWindowListener(
                new WindowAdapter() {
                    public void windowClosing( WindowEvent e )
                    {
                      System.exit( 0 );
                    }
                }
              );
    }
}

Og dertil kommer klassen ManageDB
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.io.Serializable;
import java.sql.*;;

public class ManageDB implements Serializable{
   
    final ConnectDB db;
    static ManageDB manage = null;
   
    public ManageDB()
    {
        db = ConnectDB.getInstance("jdbc:mysql://localhost/tennisschool?", "root", "123456");
        manage = this;
    }
   
    public String getValue(String wantedField, String table, String compareField, String compareValue){
        String valueString = null;
        try{
            ResultSet value = db.select( "SELECT " + wantedField + " FROM " + table + " WHERE " + compareField + " = " + compareValue );
            while (value.next()){
                valueString = value.getString(wantedField);}
        }catch(Exception e){}
        return valueString;
    }
   
    public String getValue2(String wantedField, String table, String compareField1, String compareValue1, String compareField2, String compareValue2){
        String valueString = null;
        try{
            ResultSet value = db.select( "SELECT " + wantedField + " FROM " + table + " WHERE " + compareField1 + "=" + compareValue1 + " AND " + compareField2 + "='" +  compareValue2 + "'");
            while (value.next()){
                valueString = value.getString(wantedField);}
        }catch(Exception e){}
        return valueString;
    }
   
    public ResultSet getTable(String table){
        return db.select( "SELECT * FROM " + table );
    }
   
    public ResultSet getData(String wantedField, String table, String compareField, String compareValue){
        return db.select( "SELECT " + wantedField + " FROM " + table + " WHERE " + compareField + " = " + compareValue );
    }
   
    public void update( String SQL ){
        db.update( SQL );
    }
   
    public int tableCounter(String table){
        int total = 0;
       
        try
        {
            ResultSet row = db.select( "SELECT COUNT(*) FROM " + table);
            row.next();
            total = row.getInt(1);
           
        }
        catch ( SQLException cs ){
            System.out.println(cs);
        }
       
        return total;
    }
   
    public static ManageDB getInstance(){
        if( manage == null )
            return new ManageDB();
        else return manage;
    }
}

Denne klasse benytter sig af ConnectDB-klassen der sender con.createStatement til MySQL-serveren.
Avatar billede ladbye Nybegynder
13. maj 2007 - 17:59 #4
StudentClient er lige lavet lidt om - ville egentlig have det vist i en JFrame, men det er jeg kommet fra igen. Den melder dog stadig samme fejl.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

import java.rmi.*;
import java.util.Scanner;

public class StudentClient{
   
    public StudentClient(String ip){
        super();
        getRemoteStud(ip);
    }
   
    private void getRemoteStud(String ip){
        Scanner keyB = new Scanner(System.in);
        try{
            String serverObjectName = "//" + ip + "/StudentServer";
            StudentServer mystud = (StudentServer)Naming.lookup(serverObjectName);
            String ssn = "ssn";
            while(ssn != "ssn"){
                System.out.print("Type SSN: ");
                ssn = keyB.next();
                String studentInfo = mystud.getStudentInfo(ssn);

                System.out.print(studentInfo);
               
//                JPanel p = new JPanel();
//                p.setLayout(null);
//                JLabel student = new JLabel(studentInfo);
//                p.add(student);
//                getContentPane().setLayout( new BorderLayout());
//                getContentPane().add(p, BorderLayout.CENTER);
            }
        }catch(java.rmi.ConnectException ce){
            System.err.println("Connection to server failed. Server may be temporarily unavailable.");
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
    }
   
    public static void main(String[] args){
        if(args.length == 0)
            new StudentClient("localhost");
        else
            new StudentClient(args[0]);
    }
}
Avatar billede arne_v Ekspert
13. maj 2007 - 18:07 #5
ManageDB indeholder en ConnectDB

hvis ManageDB skal være serializable så skal ConnectDB også være det
Avatar billede arne_v Ekspert
13. maj 2007 - 18:07 #6
bemærk du kan ikke sende en java.sql.Connection fra server til client
Avatar billede arne_v Ekspert
13. maj 2007 - 18:07 #7
(den er ikke serializable)
Avatar billede ladbye Nybegynder
13. maj 2007 - 18:23 #8
Selv om jeg gør ConnectDB serializable, melder den samme fejl. Kan ikke se at jeg sender Connection fra server til client, eller er der noget jeg har misforstået?
Avatar billede arne_v Ekspert
27. maj 2007 - 04:20 #9
din ConnectDB indeholder ikke en Connection ?
Avatar billede ladbye Nybegynder
18. august 2010 - 12:15 #10
Ryder lige op i gamle tråde. Læg et svar arne_v, så får du point for din hjælp.
Avatar billede arne_v Ekspert
18. august 2010 - 20:05 #11
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester