Foros del Web » Programación para mayores de 30 ;) » Java »

Duda sobre código Java + Pool de Conexiones + Tomcat 6

Estas en el tema de Duda sobre código Java + Pool de Conexiones + Tomcat 6 en el foro de Java en Foros del Web. Hola Estoy intentando crear un pool de conexiones con MySQL y Tomcat. Ya modifiqué el archivo web.xml; también creé una carpeta META-INF con el archivo ...
  #1 (permalink)  
Antiguo 11/05/2010, 00:35
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años, 7 meses
Puntos: 1
Duda sobre código Java + Pool de Conexiones + Tomcat 6

Hola

Estoy intentando crear un pool de conexiones con MySQL y Tomcat. Ya modifiqué el archivo web.xml; también creé una carpeta META-INF con el archivo context.xml; exactamente como indica el HOW TO que viene en la documentación de Tomcat.

Según yo, he realizado mi conexión a la base de datos con el código que menciona esa documentación, pero no lo coloqué dentro de un servlet, sino dentro de la clase que genera todas las conexiones a la base de datos, digamos, mi capa de Base de Datos; como sigue:

Código Codigo dentro de clase de conexión a BD:
Ver original
  1. public Connection getConexion() {
  2.         Connection conexion = null;
  3.         Context contexto = null;
  4.         Context envContexto = null;
  5.         DataSource fuente_datos = null;
  6.         try {
  7.             contexto = new InitialContext();
  8.             envContexto = (Context)contexto.lookup("java:comp/env");
  9.             fuente_datos = (DataSource)envContexto.lookup("jdbc/my_bd");
  10.             if (fuente_datos != null) {
  11.                 conexion = fuente_datos.getConnection();
  12.             }
  13.         }
  14.         catch (Exception e) {
  15.             throw new ServletException("Imposible recuperar java:comp/env/jdbc/my_bd. Ocurrió un error. ", e);
  16.         }
  17.         finally {
  18.         return conexion;
  19.         }
  20.     }

De nuevo, según yo, he creado la conexión y ahora intento acceder a un registro de la base de datos, por medio de una consulta. Aquí es cuando empiezan mis problemas. Después de exhaustivas pruebas para ver qué es lo que falla, descubrí que el código que he puesto arriba sirvió para muy poco, porque el objeto de la clase Connection, llamado conexion, permanece nulo, como así se ha declarado en su inicialización.

De acuerdo a esto, he pensado que el código anterior probablemente no deba ir en mi clase de acceso a base de datos, sino dentro de un servlet. No quiero creer esto, porque entonces, ¿dónde queda la separación entre la lógica de negocio y la capa de base de datos?

No quiero utilizar el modelo tradicional:
Código PHP:
Class.forName("com.mysql.jdbc.Driver");
            
conexion DriverManager.getConnection("jdbc:mysql://localhost:3306/"+bd_mysql_usermysql_pass ); 
Quiero usar el pool de conexiones porque, además de resultar más elegante, mi aplicación así lo requiere.

Les coloco también el código que he puesto en el archivo web.xml y en context.xml, respectivamente:

Código archivo web.xml:
Ver original
  1. <resource-ref>
  2.      <description>Pool de conexiones MySQL</description>
  3.     <res-ref-name>jdbc/my_bd</res-ref-name>
  4.     <res-type>javax.sql.DataSource</res-type>
  5.     <res-auth>Container</res-auth>
  6.     </resource-ref>
----
Código archivo context.xml:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context path="/Aplicacion">
  3. <resource name="jdbc/my_bd"
  4.             auth="Container"
  5.             type="javax.sql.DataSource"
  6.             username="mysql_user"
  7.             password="mysql_pass"
  8.             driverclassname="com.mysql.jdbc.Driver"
  9.             url="jdbc:mysql://localhost:3306/my_bd?autoReconnect=true"
  10.             maxactive="100"
  11.             maxidle="30"
  12.             maxwait="10000"/>
  13. </Context>

Anteriormente ya había realizado una aplicación con pool de conexiones, pero el código java lo coloqué dentro del servlet, en el método init, y ahì mismo realizaba las sentencias SQL. Ahora quiero hacerlo dentro del archivo de acceso a la base de datos.

Conclusión

El código que crea la conexión pues... no la crea. El objeto Connection permanece nulo, y por tanto, no puedo acceder a registros en la base de datos, utilizando el pool de conexiones.

¿Alguien tiene alguna sugerencia para resolver este problemita? He revisado los ejemplos que también hay por ahí, en la web, pero todos los que he encontrado, han colocado el código de java en su respectivo servlet, cosa que no me agrada mucho.

Les envío saludos y espero que alguien tenga alguna propuesta.

Última edición por Gguer; 11/05/2010 a las 02:41
  #2 (permalink)  
Antiguo 11/05/2010, 09:30
 
Fecha de Ingreso: febrero-2010
Mensajes: 128
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Duda sobre código Java + Pool de Conexiones + Tomcat 6

No he podido leer todo tu post entero, pero te dejo el código de mi proyecto para conectarse a la BD. Ten en cuenta que tendrás que cambiarle los parámetros de las variables. Y por cierto, yo no he modificado nada en ningún archivo de configuración del proyecto web para establecer la conexión a la Base de datos, todo lo he hecho con código.

Código:
public class ConexionBD {

    private Connection con;
    private boolean conectado = false;
    private String driver = "com.mysql.jdbc.Driver";
    private String hostname = "jdbc:mysql://mi_máquina:puerto";
    private String user = "usuario";
    private String password = "contraeña";

public void conectar() {
        try {
            Class.forName(driver).newInstance();
            con = (Connection) DriverManager.getConnection(hostname, user, password);
            conectado = true;
        } catch (Exception e) {
            System.out.println("ERROR AL CONECTAR A LA BASE DE DATOS");
            e.printStackTrace();
        }
    }

public Connection getConexion() {
        return con;
    }

    public boolean estaConectado() {
        return conectado;
    }

public void desconectar() {
        try {
            if (con != null) {
                con.close();
            }
        } catch (Exception e) {
            System.out.println("ERROR AL DESCONECTARSE DE  LA BASE DE DATOS");
            e.printStackTrace();
        }
    }

 public String SQL_SELECT_CONTRASENA_USUARIO(String email) {
        String item = new String();
        try {
            String sql = "select * from usuario where email ='" + email + "'";
            PreparedStatement s = con.prepareStatement(sql);
            ResultSet r = s.executeQuery();
            if (r.getRow() == 1) {
                //CORRECTO
                item = r.getString("password");
            } else {
                //ERROR: USUARIO NO EXISTE
            }
            s.close();
            r.close();
        } catch (Exception ex) {
            System.out.println("ERROR: SQL_SELECT_CONTRASENA_USUARIO");
            //ex.printStackTrace();
        }
        return item;
    }

Espero te sirva de ayuda. En cuanto a lo de separar la lógica de negocio de la capa de datos, es como debe ser, imagina que tienes la base de datos en otro servidor... deberias hacer RMI, pero si lo tienes todo integrado en el Servlet sería imposible..

Un saludo
  #3 (permalink)  
Antiguo 11/05/2010, 12:06
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Duda sobre código Java + Pool de Conexiones + Tomcat 6

Gracias Denis127 por tu ayuda. Justamente eso es lo que ya no quiero hacer, como lo dije en mi entrada. Yo quiero hacer un pool de conexiones, esto es: mantener una conexión para todos los accesos a la base de datos, en lugar de abrir y cerrar conexiones por cada acceso, así como se utiliza tradicionalmente.

Lo quiero hacer con pool de conexiones porque mi aplicación así lo requiere. Pensando en separar la lógica de negocio de la base de datos, es que vengo aquí, porque quiero poner el código de pool de conexiones en la clase que tiene los métodos necesarios para acceder a la base de datos, a parte de los servlets; pero a parentemente ese es el problema que tengo.

El siguiente código es el que había estado utilizando para crear el pool de conexiones, pero dentro de un servlet:

Código CP:
Ver original
  1. public void init(ServletConfig config) throws ServletException
  2.     {
  3.         try
  4.         {
  5.             Context ctx = new InitialContext();
  6.             DataSource fuenteDatos = (DataSource) ctx.lookup("java:comp/env/jdbc/my_bd");
  7.         }
  8.         catch (Exception e)
  9.         {
  10.             throw new ServletException("Imposible recuperar java:comp/env/jdbc/my_bd",e);
  11.         }
  12.     }

Lo anterior va dentro del método init, como se muestra. Ahora les muestro el código que coloco dentro del método doPost o doGet para iniciar el objeto Connection:

Código :
Ver original
  1. try{
  2.        
  3.         synchronized (fuenteDatos)
  4.             {
  5.                 conexion = fuenteDatos.getConnection(); // cogemos la conexion
  6.             }
  7.  
  8.             if(conexion == null)
  9.             {
  10.                 out.println("Error al recuperar la conexion, es nula");
  11.                 throw new ServletException("Problemas con la conexion");
  12.             }
  13. Lo demás que contiene al try, como:conexiones y acceso a registros....

Esto, además de colocar lo que ahora pongo en el archivo context.xml, en el archivo server.xml, sí me funciona muy bien. Lo que no quiero es seguir haciéndolo de esta manera, o sea, colocar la conexión en el servlet.

Espero haya sido claro y seguiré esperando propuestas

Gracias
  #4 (permalink)  
Antiguo 12/05/2010, 02:06
 
Fecha de Ingreso: febrero-2010
Mensajes: 128
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Duda sobre código Java + Pool de Conexiones + Tomcat 6

Yo siempre he estado en contra de hacer un pool de conexiones como tu lo llamas.

Los principales problemas son que limitas el número de conexiones, y puedes tener problemas de disponibilidad si las conexiones se disparan, y estar ocupando unos recursos del sistema que no están siendo utilizados muy probablemente. Se que es un coñazo, pero deberías de abrir y cerrar la conexión cada vez que hagas una conexión, y así favoreces la concurrencia.

Si quieres hacer un pool aun así, yo haría lo siguiente:

A partir del código que te dejé que sirve para una sola conexión. Yo haría una clase Conexiones que contenga un vector, e implementa los métodos para acceder a posiciones en concreto, y que esta clase se encargue de gestionar cada conexión.

Espero haberme explicado.

Saludos!
  #5 (permalink)  
Antiguo 12/05/2010, 02:14
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Duda sobre código Java + Pool de Conexiones + Tomcat 6

Hola

Así como me comentas, me imagino que también podría consumir recursos innecesarios.

Quiero usar el pool de conexiones porque esto hará que reduzca el tiempo de espera entre conexiones creadas, ya que mi aplicación hará muchas conexiones, muy probablemente al mismo tiempo y estar cerrando y abriendo conexiones tan seguido no me parece algo tan eficiente.

Creo que por el tiempo que me queda para entregar la aplicación, tendré que optar por el método que tú me mencionas, el tradicional. Te agradezco tu ayuda.
  #6 (permalink)  
Antiguo 12/05/2010, 02:24
 
Fecha de Ingreso: febrero-2010
Mensajes: 128
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Duda sobre código Java + Pool de Conexiones + Tomcat 6

Por lo que mencionas, si tantas conexiones vas a tener, aun me das mas la razón.

Tu ponte un ejemplo. Tu servidor imagina que no tiene capacidad nada mas que para procesar 10 conexiones simultaneamente contra la base de datos.

Si tienes solamente 10 usuarios accediendo a tu aplicación ya no habrá ningún problema. Pero que pasa si hay 11 ??? ese cliente tendrá que esperar a que todos finalizen su aplicación. y qeu pasaría si por ejemplo los usuarios no finalizasen correctamente su sesión y no cerrasen su conexion?? se cerraría sola??

En el caso de abrir y cerrar las conexiones, quizas te parezca menos eficiente, pero las latencias de los distintos clientes disminuyen muchisimo! y permites que haya más usuarios concurrentemente y simultaneamente.

Digamos que si haces un pool "vampirizas" la Base de datos, y unos pocos pueden tener todos los recursos aunque no los usen.

Creo que si haces un pool tienes muchos mas inconvenientes que ventajas.

Saludos
  #7 (permalink)  
Antiguo 12/05/2010, 03:54
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Duda sobre código Java + Pool de Conexiones + Tomcat 6

Estaba pensando en usar las librerías que apache commons BDCP, creo que eso me ayudaría más que el ejemplo que he puesto.

He encontrado este link sobre pool de conexiones que utiliza esas lbrerías. Con esto y buscando un poco en la documentación que apache ofrece, creo que ya va a quedar.

Etiquetas: conexiones, jdbc, pool, tomcat
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:15.