web-dev-qa-db-fra.com

Comment utiliser un objet de connexion à la base de données dans toute l'application?

J'ai créé cette classe qui retourne un objet de connexion. J'ai utilisé la base de données 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;        
    }
}  

Maintenant, tout ce que je veux faire, c'est instancier cette classe une fois et obtenir un objet de connexion. Et je veux utiliser ce même objet dans toute l'application. Une autre solution sera également appréciée.

9
Dhruv Kapatel

Je suppose que vous avez besoin d'un motif singleton, voici un exemple rapide:

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;        
    }
} 

alors vous pourrez utiliser la connexion comme ceci:

Connect_db.getConnection().somemethods();

mais, vous devriez penser - comment cela fonctionnera dans un environnement multi-thread, lorsque plusieurs threads essaient de faire des requêtes à la base de données.

7
Iłya Bursov

manière très primitive, vous pouvez obtenir une instance de connexion par

Connect_db.getConnection (dbName, userName, passwd);

dans n'importe quelle classe parce que c'est une méthode statique.

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);    
}

si votre application est multithread et devrait bien utiliser une piscine

1
JosefN

J'ai beaucoup aimé la réponse de Lashane, j'ai utilisé le code pour créer une solution DataSource. Je l'ai également reconfiguré pour stocker uniquement la variable DataSource et non la Connection, au cas où vous souhaiteriez en ouvrir plusieurs.

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();
        }
    }
}

Ensuite, vous pouvez créer des connexions en utilisant:

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

J'ai ajouté la possibilité de se connecter à une base de données différente à chaque fois, dans certains cas, comme le nôtre, c'est ce que vous devez faire à la volée.

J'espère que cela t'aides.

1
Dmitry Buslaev