Saltar al contenido

Si uso una clase singleton para una conexión a la base de datos, ¿puede un usuario cerrar la conexión para todos?

Nuestros programadores estrellas han agotado sus depósitos de café, investigando a tiempo completo por la resolución, hasta que Nora encontró la contestación en Gogs así que en este momento la comparte aquí.

Solución:

Mientras no devuelvas el mismoConnection instancia en getConnection() llama, entonces no hay nada de qué preocuparse. Cada persona que llame obtendrá su propia instancia. Hasta ahora, está creando una nueva conexión en cada getConnection() llamar y por lo tanto no devolver algunos static o variable de instancia. Así que es seguro.

Sin embargo, este enfoque es torpe. No es necesario que sea un singleton. Una clase de ayuda/utilidad también está perfectamente bien. O si desea un poco más de abstracción, un administrador de conexión devuelto por una fábrica abstracta. Solo lo cambiaría para obtener la fuente de datos solo una vez durante la inicialización de la clase en lugar de cada vez en getConnection(). Es la misma instancia cada vez de todos modos. Mantenlo barato. Aquí hay un ejemplo básico de lanzamiento:

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


que se utilizará de la siguiente manera según el idioma normal de JDBC.

public List list() throws SQLException 
    List entities = new ArrayList();

    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;

Ver también:

  • ¿Es seguro usar un static java.sql.Instancia de conexión en un sistema multiproceso?

El siguiente código es un Patrón Singleton probado y en funcionamiento para Java.

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;
    

Mientras obtiene la conexión en cualquier clase, simplemente use la siguiente línea

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

Espero que pueda ayudar 🙂

package es.sm2.conexion;

    import java.sql.Connection;
    import java.sql.DriverManager;

    public class ConexionTest 
        private static Connection conn = null;

        static Connection getConnection() throws Exception 
            if (conn == null) 
                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();
                conn = DriverManager.getConnection(url + dbName, userName, password);
            

            return conn;
        
    

Para cerrar Conexión

public static void closeConnection(Connection conn) 

        try 

            conn.close();

         catch (SQLException e) 

        

    

Para llamar a la conexión:

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

        
    

Valoraciones y comentarios

No se te olvide difundir este escrito si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *