Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    317

    Help con Thread (?forse?)

    Ciao ragazzi,non sapevo proprio che titolo potesse riassumere il mio problema...
    Comincio subito a spiegare la mia situazione:
    Ho un metodo di una classe che si riassume più o meno così:

    codice:
    {
    ...
    Operazioni varie
    ... 
    int id_utente = new UserService(username).OttieniIdUtente();
    ...
    altre operazioni che utilizzano l'id_utente
    ...
    }
    il metodo OttieniIdUtente() della classe UserService accede al database e ritorna l'id_utente corrispondente alla stringa username.
    Funziona tutto perfettamente...se eseguo in modalità step by step (in debug)!! Cioè se sono io a seguire le linee di codice arrivo alla linea successiva che id_utente è stato correttamente settato.
    Diveramente se eseguo il programma normalmente (Run) id_utente non viene settata, resta a 0 e non riesco ad utilizzarla correttamente nelle operazioni al di sotto di quella riga.

    Io credo che ci vogliano thread o metodi synchronized, cercare di dirgli di restare in attesa che il metodo OttieniIdUtente() finisca prima di proseguire...solo che non so usarli
    Cosa ne pensate voi? Potrei aver ragione o sono fuori strada...Potreste postarmi qualche soluzione al mio problema per favore? Se vi servono maggiori informazioni chiedete pure...
    Vi ringrazio in anticipo


  2. #2
    I metodi synchronized servono solo per impedire che due thread diversi accedano contemporaneamente ad una stessa risorsa creando un pasticcio colossale, non centra con il fatto di attendere o meno, in teoria quando fai la tua chiamata al metodo dovrebbe rimanere in attesa fino al momento in cui il controllo ritorna al codice che hai scritto.
    Magari c'è qualcosa che non va nel metodo che chiami... :master:
    Ma hai più thread o uno solo??

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    317
    Ciao, io non ho creato nessun thread, non li uso appunto perchè non sono pratico...quindi la mia programmazione è tutto in stile "classico"...
    Il programma dovrebbe proseguire solo quando la chiamata al metodo restituisce il controllo, ma evidentemente c'è qualcosa che mi sfugge...
    Il metodo OttieniIdUtente() funziona correttamente, ad esempio se seguo lo svolgimento del programma in debug mi restituisce correttamente l'id_utente !!!
    Non capisco
    Non è difficile, semplicemente si connette ad db e fa una SELECT per ritornare l'id_utente dove il campo username=username (passato al costruttore UserService).
    Per il momento ho risolto la cosa mettendo un ciclo (tra i vari e disperati tentativi che ho fatto)
    ho messo:

    UserService service = new UserService(username);
    int id_utente = 0;

    while(id_utente==0)
    {
    id_utente = service.OttieniIdUtente();
    }
    ...altre operazioni

    In questo modo esco dal ciclo che la variabile id_utente è correttamente settata...Ma NON MI PIACE PROPRIO...è una soluzione tappabuchi...Comunque finchè non si arriva al perchè si comporta così terrò questa.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Credo sia più opportuno postare il codice del metodo OttieniIdUtente della classe UserService, per vedere che non contenga errori che portino al risultato errato.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Capisco...prova a mettere magari anche il codice della classe UserService, tanto per avere un'idea, perchè mi sembra strana sta cosa... :master:


    PS: sono stato anticipato...
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    317
    codice:
    package com.myapp.Model.Services;
    import com.myapp.Model.DBMenager;
    import com.myapp.Global.constant;
    import java.util.*;
    import java.sql.*;
    
    public class UserService {
        private DBMenager db = new DBMenager(constant.DBUTENTI); 
        private ResultSet rs;
        private User utente;
        private UserDetails dettagli_utente;
        private int id_user = 0;
        private String userName;
    
    public UserService(String username)
        {
            userName = username;
        }
        
        public int OttieniIdUtente() throws Exception
        {
            if(id_user==0)
            {
                if(!db.isConnesso())
                {
                    db.Connect();
                }
                String query ="" +
                    "SELECT id_utente FROM T_utenti WHERE username='"+db.getDatabaseString(userName)+"';";
                    rs = db.querySelect(query);
                    if(rs.next())
                    {
                        id_user = rs.getInt(1); 
                        db.disconnetti();
                        
                    }
                
            }
            return id_user;
        }
    Ecco qui il codice della classe UserService, ci sono altri metodi e ovviamente la chiusura della classe, ma per questo problema utilizzo solo il metodo OttieniIdUtente().
    Ripeto che se eseguo in debug, step by step ottengo correttamente id_utente da questo metodo...

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Non so se è sufficiente. Io volevo sincerarmi del fatto che tu non usassi qualche metodo che avvii un processo asincrono per restituire i dati di cui hai bisogno.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    317
    Allora proseguo il codice...manca solo qualche metodo simile per finire la classe UserService:
    Subito dopo quello cho ho già postato....
    codice:
    public UserService(int id_utente) // Secondo costruttore
        {
            id_user = id_utente;   
        }
    public String getEmail()
        {
            String email = null;
            try
            {
                if(!db.isConnesso())
                {
                    db.Connect();
                }
                String query = "" +
                        "SELECT T_mail.email FROM T_mail INNER JOIN T_utenti ON " +
                        "T_utenti.id_utente=T_mail.id_utente" +
                        " WHERE T_utenti.id_utente="+id_user+";";
                rs = db.querySelect(query);
                if(rs.next())
                {
                   email = rs.getString(1);
                   
                }
                
            }catch(Exception e){   db.disconnetti();    }
            
            db.disconnetti();
            return email;
        }
    public java.sql.Date getDate(String qualedata)throws Exception
        {
            if(!db.isConnesso())
                        {
                            db.Connect();
                        }
                String query = "" +
                        "SELECT T_date.* FROM T_utenti " +
                        "INNER JOIN T_date ON T_utenti.id_utente = T_date.id_utente " +
                        "WHERE T_utenti.id_utente="+id_user+";";
                rs = db.querySelect(query);
                if(rs.next())
                {
                        if(qualedata.equals("lastaccess"))
                        {
                                db.disconnetti();
                                return rs.getDate("lastaccess");
                        }
                        if(qualedata.equals("creato"))
                        {
                                db.disconnetti();
                                return rs.getDate("creato");
                        }
                }
            
            db.disconnetti();
            return null;
            
        }
    
     public void setAvvisi()
     {
         boolean avvisi = true;
         try{
              if(!db.isConnesso())
                        {
                            db.Connect();
                        }
             
             String sql = "" +
                     "UPDATE T_utenti SET fl_avvisi="+avvisi+" WHERE id_utente="+id_user+";";
             db.eseguiAggiornamento(sql);
             utente= this.getUser();
             db.disconnetti();
         }
         catch(Exception e)
         {
             
         }
     }
     
     public void setVerify()
     {
         boolean verify = true;
         try{
              if(!db.isConnesso())
                        {
                            db.Connect();
                        }
             
             String sql = "" +
                     "UPDATE T_utenti SET fl_verify="+verify+" WHERE id_utente="+id_user+";";
             
             db.eseguiAggiornamento(sql);
             utente = this.getUser();
             db.disconnetti();
         }
         catch(Exception e)
         {
             
         }
     }
    
     public void setActive()
     {
         boolean attivo = true;
         try{
              if(!db.isConnesso())
                        {
                            db.Connect();
                        }
             
             String sql = "" +
                     "UPDATE T_pass SET fl_active="+attivo+" WHERE id_utente="+id_user+";";
             db.eseguiAggiornamento(sql);
             db.disconnetti();
         }
         catch(Exception e)
         {
             
         }
     }
     public Vector getInfoAccount() throws Exception
    {
        if(utente==null)
                 {
                     utente = this.getUser();
                 }
        
        com.myapp.Model.Buisiness.FileMenager serviceFile;
        Vector result = null;
            String username = utente.getUsername();
            serviceFile = new com.myapp.Model.Buisiness.FileMenager(username);
            String initAccount = serviceFile.getInitAccount();
            result = serviceFile.FileParser(initAccount);
    
        return result;
    }
    }
    // fine Classe...
    Spero ti possa essere utile e grazie per l'aiuto...
    ciao

  9. #9
    Utente di HTML.it L'avatar di blueice
    Registrato dal
    Feb 2001
    Messaggi
    121
    Controlla che il metodo db.getDatabaseString(userName) ti restituisca il valore appropriato;Cmq, io svilupperei la query in questo modo :

    Codice PHP:
    ...

    String query = new String("SELECT id_utente FROM T_utenti WHERE username='"+this.userName+"'");

    ... 
    Un piccolo suggerimento, invece di chiudere la connessione un paio di volte in ogni singolo metodo utilizza questo codice :

    Codice PHP:

    try{
       ...
    }catch(
    Exception e){
      ...
    }finally{ 
    chiudi tutti gli oggetti che vuoi ed in qualsiasi caso sia andato il codice. } 
    Puoi farmi vedere la classe DBMenager (in inglese è manager, non lo dire a nessuno ).

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    317
    Per questa classe ho preso spunto da un post che ho trovato sul forum...
    codice:
    import java.sql.*;
    import javax.swing.*;
    import com.myapp.Global.*;
    
    public class DBMenager {
        
       private String nomeDB;       
       private String nomeUtente;   
       private String pwdUtente;   
       private String errore;      
       private Connection db;    
       private boolean connesso;    
       private Statement st;
     
        /** Creates a new instance of DBMenager */
        public DBMenager(String nomeDB)
        { 
            this(nomeDB, "", ""); 
        } 
        public DBMenager(String nomeDB, String nomeUtente, String pwdUtente) {
          this.nomeDB = nomeDB;
          this.nomeUtente = nomeUtente;
          this.pwdUtente = pwdUtente;
          connesso = false;
          errore = "";
       }
        
        public boolean Connect()
        {
            connesso = false;
            try
            {
                //***********************************
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                //***********************************
               
                
                //Class.forName("com.mysql.jdbc.Driver");
                
              
             if (!nomeDB.equals("")) {
    
                
                if (nomeUtente.equals("")) {
    
                    //***************con ACCESS*************
                   db = DriverManager.getConnection("jdbc:odbc:"+nomeDB);
                   db.setAutoCommit(true);
                   st=db.createStatement();
                   //************************
    
                   //db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB);
                
    } else {
                   if (pwdUtente.equals("")) {
                      db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente);
                   } else {
                      db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente + "&password=" + pwdUtente);
                   }
                }
                connesso = true;
             } else {
                System.exit(0);
             }
          } catch (Exception e) { 
              
              JOptionPane.showMessageDialog(null,"Error dbManager - CONNECT\n\n"+e,"ERRORE ORRORE",JOptionPane.ERROR_MESSAGE);
          
              errore = e.getMessage(); }
          return connesso;
       }
           
    public ResultSet querySelect(String query) 
         {
            
          try {
             
             ResultSet rs = st.executeQuery(query);   
             return rs;
             
          } catch (Exception e) { 
              
              JOptionPane.showMessageDialog(null,"Error dbManager - querySELECT\n\n"+e,"ERRORE ORRORE",JOptionPane.ERROR_MESSAGE);
             
              e.printStackTrace(); 
              errore = e.getMessage(); }
    
          return null;
        }
    
         public boolean eseguiAggiornamento(String query) {
          int numero = 0;
          boolean risultato = false;
          try {
           
             numero = st.executeUpdate(query);
             risultato = true;
            
          } catch (Exception e) {
             
              JOptionPane.showMessageDialog(null,"Error dbManager - eseguiAggiornamento sql\n\n"+e,"ERRORE ORRORE",JOptionPane.ERROR_MESSAGE);
             
             e.printStackTrace();
             errore = e.getMessage();
             risultato = false;
          }
          return risultato;
       }
    
       public void disconnetti() {
          try {
             db.close();
             st.close();
             connesso = false;
          } catch (Exception e) { 
              
              JOptionPane.showMessageDialog(null,"Error dbManager - CloseConnection\n\n"+e,"ERRORE ORRORE",JOptionPane.ERROR_MESSAGE);
             e.printStackTrace(); }
       }
    
       public boolean isConnesso() { return connesso; }   
       public String getErrore() { return errore; }  
       
       public String getDatabaseString(String query)
        {
            if (query == null)
            {
                return "-";
            }
            StringBuffer temp = new StringBuffer();
            int indexFrom = 0;
            int indexTo = 0;
            indexTo = query.indexOf("'",indexFrom);
            while(indexTo>=0)
            {
                temp.append(query.substring(indexFrom, indexTo));
                temp.append("^");
                indexFrom = indexTo;
                indexTo = query.indexOf("'", ++indexFrom);
            }
            temp = temp.append(query.substring(indexFrom, query.length()));
            for(int i=temp.length()-1; i>=0; i--)
            {
                if(temp.charAt(i) =='"')
                    temp.deleteCharAt(i);
            }
            return temp.toString();
        }
    }
    Si si il nome l'ho scelto io perchè avevo già un'altra classe dbMenager realizzata in modo leggermente diverso
    Comunque...il metodo getDatabaseString funziona bene, mi serve solo per evitare l'sql injection più banale laddove l'utente inserice testo nei campi dei form...mi sono abituato ormai a utilizzarla tutte le volte che utilizzo una variabile presa in request e che deve andare nelle condizioni della query. Per provare comunque l'ho tolta e non è cambiato niente...

    Una semplice domanda di conferma...secondo te ho fatto bene ad aprire la connessione al db nel costruttore e chiuderla poi alla fine di ogni metodo ???

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.