Pool de conexiones

Buenas tardes alguien me podria ayudar! en esta duda!

1.- Quisiera saber como comprobar el numero de conexiones max-pool y el min-pool en java para realizar un test ala conexion.
2.- Si tengo 5 conexiones configuradas como saber, que una ya se libero y puedo utilizarla en caso de querer hacer una nueva que agrege una nueva conexion.
3.- Que pasa si al realizar un conexion.close agrego despues un ResultSet o un Statement. esto para un testing en java.

Para comprobar el pool de conexiones.
saludos espero que me puedan brindar una ayuda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: comprobar el pool de conexiones

Una opción es depurar (debug) la aplicación. Y otra, dependiendo de la implementación del pool, es habilitar el registro (TRACE).

Imagen de joseguru

tengo este codigo para testing

public class Beans {
        private Connection conexion = null;
public  Connection getConnectionDato() throws SQLException{
               
                DataSource datasource=null;
               
                try {
                       
                        InitialContext cxt = new InitialContext();
                         datasource = (DataSource) cxt.lookup("java:jboss/driver/informix");
                         
                         
                         
                       
                } catch (Exception e) {
                        // TODO: handle exceptio
                        e.printStackTrace();
                }
                return datasource.getConnection();
               
               
        }
       
       
       

public  void mostrarProcedimiento() throws SQLException {

ResultSet rs=null;
PreparedStatement ps=null;
     try{
           
             System.out.println("Numero de conexiones");
             for (int i = 0; i < 9; i++) {
                               
                                System.out.println(conexion = getConnectionDato());
                               
                       
                        }
           
            ps = conexion.prepareStatement("SELECT * FROM prueba");
              rs=ps.executeQuery();
           
           System.out.println("Mostrar");
        while(rs.next()){
               
               System.out.println("ID"+"->\t"+"\tNombre"+"->\t"+"\tnombre2"+"->");
               System.out.println("\t"+rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
             
               
               
               
        }
        System.out.println("cierro");
     //  conexion.close();
      // ps.close();
       //rs.close();
 
        /*mientras esta cerrado termina el resultset al igual que el statement*/
   
           
               
       
             
         
     } catch (Exception e) {
        // TODO Auto-generated catch blockso
                                System.out.println("*****");
                                e.printStackTrace();
                        }finally{
                                if (conexion!=null) {
                                        try {
                                                conexion.close();
                                                  ps.close();
                                               rs.close();
                                        } catch (SQLException e) {
                                                // NO-OP
                                        }
                                }
                               
                        }
}

       
       
}

Imagen de ezamudio

No

Ese método de obtener una conexión sólo es bueno tenerlo si lo vas a usar en try-with-resources, de otro modo es un antipatrón.

Y eso que dices de que quieres saber si una conexión ya se liberó para usarla y no sé qué, pues sólo es relevante si estás implementando un pool de conexiones, cosa que NO deberías hacer. Precisamente el pool de conexiones es el que se encarga de administrar las conexiones a la base de datos y si es necesario crear una nueva lo hará, o si es necesario dejarte esperando un rato primero para ver si se libera alguna otra lo hará, para que tú no tengas que preocuparte por nada de eso. Cuando invocas getConnection, no te debe importar si se acaba de crear esa conexión o si ya estaba hecha desde antes; cuando la obtienes es porque está libre y nadie la va a usar mientras la tengas tú. Pero es muy importante que siempre le des close al final porque eso realmente no cierra la conexión sino que la devuelve al pool, por eso las debes usar de esta forma si es que vas a lidiar con conexiones de manera directa:

try(Connection conn = getConnectionDato()) {
 //aquí la usas
}

Eso que estás haciendo de invocar getConnectionDato() en un ciclo, lo único que estás causando es que obtienes 9 conexiones y solamente usas la última, y al final, solamente devuelves esa al pool, todas las demás siguen estando marcadas como ocupadas, aunque nunca las usaste. Eso se llama resource leak.

Imagen de joseguru

Gracias por tu respuesta ! si estoy implementando un pool

De hecho se esta implementando un pool de conexiones,
por ello la pregunta y gracias por aclararme algunos puntos. que tengo que corregir.

Imagen de ezamudio

no lo implementes

Usa commons DBCP o C3P0 o BoneCP, no implementes uno.

Reinventar la rueda

 

Si vas a “reinventar” la rueda, al menos, hazla bien. (1) No vaya a pasar lo siguiente:

img


  1. Recomendable únicamente si esto tiene propósitos didácticos.

~~~

Imagen de joseguru

gracias! por sus respuestas

Tomare mucho en cuenta! sus respuestas y gracias! por el apoyo. ..