Comment puis-je utiliser un objet de connexion de base de données dans toute l'application? [dupliquer]


Cette question a déjà une réponse ici:

J'ai créé cette classe qui renvoie 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 est d'instancier cette classe une fois et d'obtenir un objet de connexion. Et je veux l'utiliser ce même objet dans toute l'application. Une autre solution sera également appréciée.

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

3 answers

Je suppose que vous avez besoin d'un modèle 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;        
    }
} 

Ensuite, 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 demandes à la base de données.

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

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

Connect_db.getConnection(dbName,nom d'utilisateur,mot de passe);

Dans n'importe quelle classe car 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 mutlithreaded et devrait bien utiliser un pool

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

J'ai vraiment aimé la réponse de Lashane, j'ai utilisé le code pour créer une solution DataSource. Je l'ai également repensé pour ne stocker que DataSource et non le Connection, au cas où vous voudriez 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 aide.

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