web-dev-qa-db-fra.com

Si j'utilise une classe singleton pour une connexion de base de données, un utilisateur peut-il fermer la connexion pour tout le monde?

J'ai écrit une classe singleton pour obtenir une connexion à une base de données.

Maintenant, ma question est la suivante: supposons que 100 utilisateurs accèdent à l’application. Si un utilisateur ferme la connexion, la connexion sera-t-elle fermée pour les 99 autres utilisateurs?

Voici mon exemple de programme qui utilise une classe singleton pour établir une connexion à une base de données:

public class GetConnection {

    private GetConnection() { }

    public Connection getConnection() {
        Context ctx = new InitialContext();
        DataSource ds = ctx.lookup("jndifordbconc");
        Connection con = ds.getConnection();
        return con;
    }

    public static  GetConnection   getInstancetoGetConnection () {
        // which gives GetConnection class instance to call getConnection() on this .
    }
}

Guidez-moi s'il-vous-plaît.

14
hanhu

Tant que vous ne renvoyez pas l'instance sameConnection à l'appel getConnection(), vous n'avez pas à vous inquiéter. Chaque appelant aura alors sa propre instance. Pour l'instant, vous créez une nouvelle connexion à chaque appel getConnection() et vous ne renvoyez donc pas de variable statique ou d'instance. Donc c'est sûr.

Cependant, cette approche est maladroite. Il n'est pas nécessaire que ce soit un singleton. Une classe utilitaire/utilitaire convient également parfaitement. Ou si vous voulez un peu plus d'abstraction, un gestionnaire de connexions renvoyé par une fabrique abstraite. Je ne le changerais que pour obtenir la source de données une seule fois lors de l'initialisation de la classe au lieu de chaque fois dans getConnection(). En tout cas, c'est la même instance à chaque fois. Gardez-le pas cher. Voici un exemple de base de coup d'envoi:

public class Database {

    private static DataSource dataSource;

    static {
        try {
            dataSource = new InitialContext().lookup("jndifordbconc");
        }
        catch (NamingException e) { 
            throw new ExceptionInInitializerError("'jndifordbconc' not found in JNDI", e);
        }
    }

    public static Connection getConnection() {
        return dataSource.getConnection();
    }

}

qui doit être utilisé comme suit selon l’idiome JDBC normal.

public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();

    try (
        Connection connection = Database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, foo, bar FROM entity");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Entity entity = new Entity();
            entity.setId(resultSet.getLong("id"));
            entity.setFoo(resultSet.getString("foo"));
            entity.setBar(resultSet.getString("bar"));
            entities.add(entity);
        }
    }

    return entities;
}

Voir également:

24
BalusC
package es.sm2.conexion;

import Java.sql.Connection;
import Java.sql.DriverManager;

public class ConexionTest {

    static Connection getConnection() throws Exception {

        String url = "jdbc:mysql://localhost:3306/";
        String dbName = "test";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "userparatest";
        String password = "userparatest";

        Class.forName(driver).newInstance();
        Connection conn = DriverManager.getConnection(url + dbName, userName,password);

        return conn;
    }
}

Fermer la connexion

public static void closeConnection(Connection conn) {

        try {

            conn.close();

        } catch (SQLException e) {

        }

    }

Pour appeler à la connexion:

package conexion.uno;

import Java.sql.*;

import es.sm2.conexion.ConexionTest;

public class LLamadorConexion {

    public void llamada() {
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet resultado = null;
        String query = "SELECT * FROM empleados";

        try {
            conn = ConexionTest.getConnection();
            statement = conn.prepareStatement(query);
            resultado = statement.executeQuery();

            while (resultado.next()) {
                System.out.println(resultado.getString(1) + "\t" + resultado.getString(2) + "\t" + resultado.getString(3) + "\t" );
            }
        } 
        catch (Exception e) {
            System.err.println("El porque del cascar: " + e.getMessage());
        } 
        finally {
            ConexionTest.closeConnection(conn);

        }
    }
}
2
PauRibes

Le code ci-dessous est un Singleton Pattern pour Java fonctionnel et testé.

public class Database {

    private static Database dbIsntance;
    private static Connection con ;
    private static Statement stmt;


    private Database() {
      // private constructor //
    }

    public static Database getInstance(){
    if(dbIsntance==null){
        dbIsntance= new Database();
    }
    return dbIsntance;
    }

    public  Connection getConnection(){

        if(con==null){
            try {
                String Host = "jdbc:derby://localhost:1527/yourdatabasename";
                String username = "yourusername";
                String password = "yourpassword";
                con = DriverManager.getConnection( Host, username, password );
            } catch (SQLException ex) {
                Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return con;
    }

Tout en obtenant une connexion dans une classe, utilisez simplement la ligne ci-dessous

Connection con = Database.getInstance().getConnection();

J'espère que ça peut aider :)

0
farhangdon
import Java.sql.Connection;
import Java.sql.DriverManager;

public class sql11 {

    static Connection getConnection() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/ics", "root", "077");
        return c;

    }
}
0
gayan rangana

Great post, farhangdon! Cependant, j’ai trouvé cela un peu gênant car une fois que vous avez fermé la connexion, vous n’avez plus aucun moyen d’en créer une nouvelle. Un petit truc va le résoudre cependant: 

Remplacez if(con==null) par if(con==null || con.isClosed())

0
Mr. Demirel