Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/05/2010, 00:35
Avatar de Gguer
Gguer
 
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años
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