Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    Java database Connector/J

    Premetto che sto studiando ora per la prima volta i database in relazione al java.
    Il mio intento sarebbe quello di utilizzare un database jdbc per un mio progetto java.
    Ho scaricato il driver Connector/J dal sito di mysql ho settato la classpath al jar scaricato e ho provato ad avviare questo codice trovato su internet come prova per testare se fosse tutto ok e se fossi riuscito ad efefttuare una connessione ad un database:

    codice:
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class JdbcExample2 {
    
      public static void main(String args[]) {
        Connection con = null;
    
        try {
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          con = DriverManager.getConnection("jdbc:mysql:///test","root", "secret");
    
          if(!con.isClosed())
            System.out.println("Successfully connected to " +
              "MySQL server using TCP/IP...");
    
        } catch(Exception e) {
          System.err.println("Exception: " + e.getMessage());
        } finally {
          try {
            if(con != null)
              con.close();
          } catch(SQLException e) {}
        }
      }
    }
    Il codice viene compilato senza alcun errore ma andando ad avviare ottengo stampato a video il seguente messaggio di errore:

    codice:
    Exception: Communications link failure
    
    The last packet sent successfully to the server was 0 milliseconds ago. The driv
    er has not received any packets from the server.
    aggiungendo un "e.printStackTrace() nel catch ottengo ciò:

    codice:
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link fai
    lure
    
    The last packet sent successfully to the server was 0 milliseconds ago. The driv
    er has not received any packets from the server.
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
    orAccessorImpl.java:39)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
    onstructorAccessorImpl.java:27)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
            at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1
    116)
            at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
            at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332)
            at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2
    369)
            at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
            at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
            at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
    orAccessorImpl.java:39)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
    onstructorAccessorImpl.java:27)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
            at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
            at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java
    :305)
            at java.sql.DriverManager.getConnection(DriverManager.java:582)
            at java.sql.DriverManager.getConnection(DriverManager.java:185)
            at JdbcExample2.main(JdbcExample2.java:12)
    Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.PlainSocketImpl.socketConnect(Native Method)
            at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
            at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
            at java.net.Socket.connect(Socket.java:529)
            at java.net.Socket.connect(Socket.java:478)
            at java.net.Socket.<init>(Socket.java:375)
            at java.net.Socket.<init>(Socket.java:218)
            at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja
    va:257)
            at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
            ... 15 more

    Perchè ciò accade?cosa ho sbagliato?Come posso risolvere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    conviene capire un po' come hai configurato MySQL perché a fare un copia-incolla non sempre ci si cava un ragno dal buco... in particolare questa a me non "piace" molto, ovvero ho qualche sospetto:
    codice:
    DriverManager.getConnection("jdbc:mysql:///test","root", "secret");
    Analizziamo
    codice:
    jdbc:mysql:
    fin qui tutto bene, dice in sostanza che usi JDBC per connetterti ad un database MySQL... poi però bisogna dirgli dove andare a trovare l'istanza di MySQL (vedila un po' come l'indirizzo macchina su cui è installato il database o sul quale è in ascolto), e qui ci sono dei problemi
    codice:
    ///
    che cos'è? mi aspetterei un indirizzo IP o il nome del server (localhost per un'installazione locale ad esempio)

    Il resto potrebbe anche andare bene, ammesso che ci sia un database chiamato "test".

    Riguarda un attimo l'installazione di MySQL (ovvero come l'hai configurato), sistema quella stringa di connessione, e poi fai un giro qui:
    Pillola LeleFT - Java & Database
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Vado ora un po' più nello specifico.
    Ho creato un client mail in java con il quale tramite autenticazione (nome utente e password) si riesce ad entrare (per visualizzare,inviare ecc. mail) al proprio account di posta elettronica (hotmail,libero,yahoo,gmail)...il software all'avvio (dopo l'autenticazione) provvede a scaricare la posta dell'account e a visualizzarne il contenuto in un JTable;ora vorrei fare un po' come fa Thunderbird:all'avvio (primo avvio) scarica la posta e mette il contenuto (penso) in un database,riavviando il software esso si rimetterà a riscaricare le mail se e solo se ci sono state delle modifiche (questo posso gestirlo con le opportune librerie,il problema non è questo)
    Quello che vorrei chiedere è:dovrei creare un database per il programma,mi converrebbe creare un unico database all'interno del quale mettere i dati di ciascun account (quindi tutti gli account in un unico database,l'accesso alle informazioni avverrebbe tramite ovviamente autenticazione)?Fare un database per ogni account è una cosa insensata vero?Mi date qualche delucidazione a riguardo?

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Concordo con te sulla necessità di salvare la posta già scaricata e quella inviata in un qualche formato facilmente accessibile e gestibile. Perché non usare un database.

    Hai detto bene, non ha senso creare un database per ogni utente, anche se la cosa in sè non comporta molti problemi (che cambia connettersi a: database_posta_nome_utente) oppure fare query del tipo: SELECT * FROM messaggi WHERE ... AND id_user = user_loggato

    La cosa invece di cui preoccuparsi, una volta risolti i problemi di connessione è la sicurezza dei dati... sarebbe poco simpatico che le email, rubriche e quant'altro venissero salvati in chiaro nel database.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    La cosa invece di cui preoccuparsi, una volta risolti i problemi di connessione è la sicurezza dei dati... sarebbe poco simpatico che le email, rubriche e quant'altro venissero salvati in chiaro nel database.
    Bè si hai ragione.Ma hai qualche idea su come fare per garantire sicurezza a riguardo?Dovrei fare una sorta di codifica?Che però poi nell'andare a recuperare le informazioni ,cioè andare a decodificare il tutto ogni volta sarebbe (a mio parere) abbastanza rognoso...a questo punto forse sarebbe più sicuro salvare in chiaro i dati di ciascun account in un proprio database,il cui accesso è vincolato da autenticazione...cosa ne pensi?

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Comunque tornando alla pratica in un codice di prova non riesco a creare un database,il codice è il seguente:

    codice:
    import java.sql.*;
    
    public class Main {
    
        public static void main(String[] argv) throws Exception{
    		Class.forName("com.mysql.jdbc.Driver").newInstance();
    		System.out.println("ok");
    		Connection con = DriverManager.getConnection("jdbc:mysql:///test","root", "miaPassword");
    		if(!con.isClosed()){
    			System.out.println("Successfully connected to " +"MySQL server using TCP/IP...");
    		}
    		Statement st=con.createStatement();
    		ResultSet rs=st.executeQuery("CREATE DATABASE proviamo");
    		int i=1;
    		while(rs.next()){
    			System.out.println(rs.getString (i));
    			i++;
    		}
    		st.close();
        }
    
    }
    Ottengo la seguente eccezzione alla riga ResultSet rs=st.executeQuery("CREATE DATABASE proviamo"); :

    codice:
    Exception in thread "main" java.sql.SQLException: Can not issue data manipulatio
    n statements with executeQuery().
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
            at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:490)
            at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1467)
            at Main.main(Main.java:13)
    Cosa non va?Ripeto che sono alle PRIMISSIME armi con i database ed SQL

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    così impari sbattendoci il muso contro (e saranno dolori, visto che di eccezioni e cose non ovvie ce n'è a bizzeffe). Comincia col prendere confidenza con i vari

    - ResultSet
    - Statement
    - PreparedStatement

    ed in particolare, che differenza c'è tra Statement e PreparedStatement e in Statement i vari metodi executeQuery, executeUpdate e il semplice execute. Per farla breve, ma ciò non toglie che DEVI spippolare un po', esempi ed API alla mano, executeQuery non si usa per "modificare" un database... a tutti gli effetti, aspettati di usare executeQuery solo per fare delle SELECT.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Si hai perfettamente ragione,dovrei studiare per bene tutto ciò che riguarda l'sql e simili prima teoricamente per poi passare ad applicarli alla pratica...il problema sta però nel fatto che essendo io uno studente universitario,e visto il fatto che tale progetto non riguarda lo studio ma è una cosa mia personale,per non levare troppo tempo allo studio ho voluto provare a imparare a riguardo direttamente sul campo senza studiare prima accuratamente le apposite basi teoriche...vabè a tempo perso vedrò di approfondire la questione

    Per la cronaca la questione della creazione del database l'ho risolta nel seguente modo (poi ho visto che nella tua risposta lo hai fatto presente):

    codice:
    Statement st=con.createStatement();
    st.executeUpdate("CREATE DATABASE nomeDatabase");
    Grazie dell'aiuto,ciao!

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    E' tutto comprensibilissimo (anch'io faccio tutt'altro), ma quando alka, LeleFT, io ed altri diciamo "fai una ricerca", o "leggi le API" è perché normalmente le risposte sono lì, scritte in chiaro (magari in inglese) e si arriverebbe alla soluzione molto prima, lasciando al forum più spazio per problematiche di più ostica soluzione.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Solo una domanda ancora vorrei porre,ho notato che ad esempio col "CRETA DATABASE nomeDB" il database viene creato in locale,ma se io volessi rendere il database in questione "pubblico" cioè accessibile tramite "un indirizzo" a qualsiasi pc come posso fare?
    Bè preferirei evitare la questione di fungere da server per gli altri pc,non esiste non so una qualche modalità di hosting di un database,in modo da renderlo disponibile in rete,ed allo stesso tempo che sia utilizzabile,accessibile e modificabile?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.