Come posso utilizzare un oggetto di connessione al database in tutta l'applicazione? [duplicato]


Questa domanda ha già una risposta qui:

Ho creato questa classe che restituisce oggetto di connessione. Ho usato il database MySQL.

public class Connect_db {        
    public Connection getConnection(String db_name,String user_name,String password)
    {
        Connection con=null;
        try
        {
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return con;        
    }
}  

Ora tutto quello che voglio fare è istanziare questa classe una volta e ottenere l'oggetto di connessione. E voglio usare questo stesso oggetto in tutta l'applicazione. Un'altra soluzione sarà anche apprezzata.

Author: Iłya Bursov, 2013-12-18

3 answers

Suppongo che tu abbia bisogno di un modello singleton, ecco un esempio rapido:

public class Connect_db {        
    static Connection con=null;
    public static Connection getConnection()
    {
        if (con != null) return con;
        // get db, user, pass from settings file
        return getConnection(db, user, pass);
    }

    private static Connection getConnection(String db_name,String user_name,String password)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return con;        
    }
} 

Allora sarai in grado di usare la connessione in questo modo:

Connect_db.getConnection().somemethods();

Ma, dovresti pensare - come funzionerà in un ambiente multi-thread, quando diversi thread stanno cercando di effettuare richieste al database.

 7
Author: Iłya Bursov, 2013-12-18 19:24:47

Modo molto primitivo, è possibile ottenere un'istanza di connessione da

Connect_db.getConnection (dbName, userName, passwd);

In qualsiasi classe perché è un metodo statico.

public class Connect_db {   
static {
     try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("MySQL db driver isnot on classpath");
    }
}
public static Connection getConnection(String db_name,String user_name,String password) throws SQLException
{
    return DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);    
}

}

Se il tuo applicaiton è mutlithreaded e dovrebbe funzionare bene usa un pool

 1
Author: JosefN, 2013-12-18 20:01:56

Mi è piaciuta molto la risposta di Lashane, ho usato il codice per creare una soluzione DataSource. L'ho anche ridisegnato per memorizzare solo DataSource e non Connection, nel caso in cui tu voglia aprirne più.

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class SignalDB {

    private static MysqlDataSource ds = null;

    public static MysqlDataSource getDataSource(String db_name) {
        if (ds == null) {
            // db variables set here
            getDataSource(db_url, db_user, db_password, db_port);
        }
        ds.setDatabaseName(db_name);
        return ds;
    }

    private static void getDataSource(String db_url, String db_user, String db_password, int db_port) {
        try {
            ds = new MysqlDataSource();
            ds.setServerName(db_url);
            ds.setUser(db_user);
            ds.setPassword(db_password);
            ds.setPort(db_port);
        } catch (Exception e) {
            System.out.println("MysqlDataSource err: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Quindi è possibile creare connessioni utilizzando:

con = SignalDB.getDataSource("database_name").getConnection();

Ho aggiunto la possibilità di connettersi a un database diverso ogni volta, in alcuni casi, come il nostro, è quello che devi fare al volo.

Spero che questo aiuti.

 1
Author: Dmitry Buslaev, 2015-10-22 20:08:06