Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Metodi statici nei vari contesti

    Io ho un'applicazione che contiene più classi. Una di queste si collega ad un database attraverso un pool di connessioni (il pool di connessioni di apache). La classe che si collega al database definisce un metodo statico shutDownDriver per chiudere il pool di connessioni. Quando io chiamo questo metodo da un'altra classe il compilatore lancia un warning :"The static method shutDownDriver() from the type Db should be accessed in a static way".
    Per completezza inserisco il codice:
    classe db

    Codice PHP:
    package model;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;

    import org.apache.commons.dbcp.ConnectionFactory;
    import org.apache.commons.dbcp.DriverManagerConnectionFactory;
    import org.apache.commons.dbcp.PoolableConnectionFactory;
    import org.apache.commons.dbcp.PoolingDriver;
    import org.apache.commons.pool.impl.GenericObjectPool;

    public class 
    Db {
        
    Db() throws Exception{
            Class.
    forName("org.gjt.mm.mysql.Driver");
            
    setupDriver("jdbc:mysql://localhost:3306/db");
        }
        public 
    Esame getEsame(String idEsamethrows SQLException{
            
            return 
    e;
        }
        public 
    ResultSet getRsForXml(Esame eStudente s) {
            return 
    null;
            
        }
        public static 
    void setupDriver(String connectionURIthrows Exception{
            
    GenericObjectPool connectionPool = new GenericObjectPool(null);
            
    connectionPool.setMaxActive(100);
            
    connectionPool.setMaxIdle(50);
            
    connectionPool.setMinIdle(5);
            
    ConnectionFactory connectionFactory 
                new 
    DriverManagerConnectionFactory(connectionURI,"root","");
            
    PoolableConnectionFactory poolableConnectionFactory =
                new 
    PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
            Class.
    forName("org.apache.commons.dbcp.PoolingDriver");
            
    PoolingDriver driver =
                (
    PoolingDriverDriverManager.getDriver("jdbc:apache:commons:dbcp:");
            
    driver.registerPool("cp"connectionPool);
        }
        public static 
    void shutDownDriver() throws Exception{
            
    PoolingDriver driver = (PoolingDriverDriverManager.getDriver("jdbc:apache:commons:dbcp:");
            
    driver.closePool("cp");
        }

    classe chiamante:

    Codice PHP:
    package model;

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import org.jdom.Document;
    import org.jdom.output.XMLOutputter;

    public class 
    Converter {
        
        
    String error;
        
    boolean e false;
        
    Db db;
        
    Converter() throws Exception{
            
    super();
            
    db = new Db();
            
        }
        public 
    void error(String error){
            
    this.error error;
            
    this.true;
        }
        public 
    String generateXml(String idesameint mod){
            
    Esame e;
            try {
                
    db.getEsame(idesame);
            } catch (
    SQLException e2) {
                try {
                    
    db.shutDownDriver();
                } catch (
    Exception e1) {
                    
    error(e1.toString());
                    return 
    error;
                }
                
    error(e2.toString());
                return 
    error;
            }
    .....................
    ...................... 
    Il metodo shutDownDriver l'ho definito statico perché così è consigliato dagli implementatori che hanno rilasciato questo esempio
    Ora le domande sono due: come posso risolvere questo warning? Lasciando la situazione com'è quali implicazioni si avranno durante l'esecuzione?
    Grazie per l'attenzione.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Metodi statici nei vari contesti

    Originariamente inviato da gokutecno
    Ora le domande sono due: come posso risolvere questo warning? Lasciando la situazione com'è quali implicazioni si avranno durante l'esecuzione?
    Non conosco bene JDBC, connection pool e il resto ... per cui non posso rispondere su queste questioni.

    Posso però dire una cosa sulla invocazione che hai fatto del metodo shutDownDriver(), visto che questo riguarda il linguaggio Java. Hai usato:

    db.shutDownDriver();

    dove 'db' è una variabile reference di tipo Db.

    Utilizzare un reference per invocare un metodo statico, non sarebbe mai da fare. Il compilatore se vede che il metodo è statico, prende in considerazione solamente il tipo del reference e basta. Bisognerebbe sempre usare il nome della classe per invocare un metodo statico:

    Db.shutDownDriver();

    Anche per una questione di leggibilità del sorgente. Chi legge db.shutDownDriver(); potrebbe essere erroneamente portato a pensare che shutDownDriver() sia un metodo di istanza invece che di classe!! Insomma, usare un reference per invocare un metodo statico è un po' come lo "specchietto per le allodole" e andrebbe quindi evitato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.