Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175

    [JDBC+MySQL] connessione persistente

    Ho una servlet del genere:
    codice:
    //... IMPORT VARI
    
    public class srvlt extends HttpServlet {   
        protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
            //... CODICE
        } 
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //... CODICE 
        } 
    
    
        protected String rQ(int id) throws ClassNotFoundException, SQLException{
            String query, info="";
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:8789/tab","user","pass");
            Statement st = conn.createStatement();
            query = "SELECT * FROM ...;
            ResultSet rs = st.executeQuery(query);
        }
    }
    Come si può vedere nell'ultimo metodo c'è una query SQL e per eseguirla devo effettuare la connessione, finchè c'è un sol metodo questo approccio è anche funzionale, ma se inizio ad avere decine di metodi che fanno tutti operazioni SQL c'è questa parte che è sempre ripetuta:
    codice:
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:8789/tab","user","pass");
    Statement st = conn.createStatement();
    Ora potrei semplificarmi in parte mettendo queste tre righe in un metodo apparte che richiamo quando mi servono quelle istruzioni, ma al di la di tutto, mi sembra uno spreco inutile eseguire una connessione per ogni metodo. C'è una pratica migliore?

  2. #2
    Puoi fare una sola Connection al database e poi ogni volta che chiami un metodo che deve connettersi al database gli passi il come parametro l'oggetto Connection creato prima.

    Certo tutti i metodi devono connettersi ovviamente allo stesso database...

  3. #3
    Puoi crearti una classe a parte che abbia le due variabili conn e st dichiarate come statiche cosicchè ogni istanza di tale classe punterà ad un unico oggetto Connection

    codice:
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class MyConnection {
        
        public static Connection conn;
        public static Statement stmt;
        
        public MyConnection(){
            try {
                if(conn==null){
                    Class.forName("com.mysql.jdbc.Driver");
                    conn = DriverManager.getConnection("jdbc:mysql://localhost:8789/tab","user","pass");
                    stmt = conn.createStatement();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        
        //qui dichiari altri metodi di utilità, ad esempio un metodo per eseguire le query
        public ResultSet eseguiQuery(String query){
             ....
        }
        
        public void close(){
              //....chiudi la connessione...
        }    
    
    }
    Quindi per utilizzare il tutto basterà eseguire:

    codice:
    MyConnection m = new MyConnection();
    ResultSet rs = m.eseguiQuery(query);
    Al mio segnale... scatenate l'inferno!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175
    Originariamente inviato da R@ve M@ster
    codice:
    MyConnection m = new MyConnection();
    ResultSet rs = m.eseguiQuery(query);
    questo va scritto in ogni metodo???

  5. #5
    Originariamente inviato da Metallica
    questo va scritto in ogni metodo???
    Puoi anche dichiararle come variabili di classe.
    Al mio segnale... scatenate l'inferno!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175
    Grazie, allora ho creato la classe MyConnection come mi hai suggerito. Ora i ogni servlet istanzio questa classe e faccio operazioni al DB senza essere ridondante...
    Ora la mia domanda è: se voglio sfruttare le potenzialità e la comodità di questa classe anche in una JSP come devo fare???

  7. #7
    Ciao,
    puoi utilizzare i datasource e la connection pooling ad esempio gestita dal tuo servlet container, ad esempio leggi qui: http://www.onjava.com/pub/a/onjava/2...th-tomcat.html

    in generale cercando "datasource" "connection pool" su google troverai docs a bizeffe.

    Inoltre se esegui spesso la stessa query ma varindo ad esempio la condizione di where, ad esempio "select * from pippo where id =?" ti consiglio di usare i PreperedStatement http://www.javaworld.com/javaworld/j...overpower.html

    buon divertimento

  8. #8
    Originariamente inviato da Metallica
    Grazie, allora ho creato la classe MyConnection come mi hai suggerito. Ora i ogni servlet istanzio questa classe e faccio operazioni al DB senza essere ridondante...
    Ora la mia domanda è: se voglio sfruttare le potenzialità e la comodità di questa classe anche in una JSP come devo fare???
    Dichiarala come Bean all'interno della jsp.
    Al mio segnale... scatenate l'inferno!

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.