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

Error - Pool de conexiones

Estas en el tema de Error - Pool de conexiones en el foro de Java en Foros del Web. Tengo este código que encontré en internet, lo adapte para que trabajara con Sybase- pero no funciona: y me genera el siguiente mensaje: Prueba del ...
  #1 (permalink)  
Antiguo 30/12/2008, 08:45
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Pregunta Error - Pool de conexiones

Tengo este código que encontré en internet, lo adapte para que trabajara con Sybase- pero no funciona:

y me genera el siguiente mensaje:
Prueba del Pool de Objetos Buscamos tutorial con sentencias preparadas Probamos a recuperar conexi�n Intento de tomar la conexion... Error al procesar consulta Cannot create JDBC driver of class '' for connect URL 'null' Error en proceso null -Fin-

Código:
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;

public class poolBaseDatos extends HttpServlet {
    
    public DataSource fuenteDatos = null;
    
    public void init(ServletConfig config) throws ServletException {
        try{
            // recuperamos el contexto inicial y la referencia a la fuente de datos
            Context ctx = new InitialContext();
            //fuenteDatos = (DataSource) ctx.lookup("java:comp/env/jdbc/Pruebas");
            // Look up a connection factory instance
            //javax.resource.cci.ConnectionFactory cf =    (javax.resource.cci.ConnectionFactory)
            
            fuenteDatos = (DataSource) ctx.lookup("java:comp/env/jdbc/Pruebas");
            //com.sybase.jdbcx.SybDataSource
        }
        catch (Exception e){
            throw new ServletException("Imposible recuperar java:comp/env/jdbc/Pruebas",e);
        }
    }
	
	//Esto se podria cambiar a private por seguridad
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        Connection con = null; // conexion parcial

        response.setContentType("text/html");   // retornamos el tipo de respuesta
        PrintWriter out = response.getWriter();

        out.println("Prueba del Pool de Objetos");
        out.println("Buscamos tutorial con sentencias preparadas");

        try {

           out.println("Probamos a recuperar conexión");

            synchronized (fuenteDatos)
            {
            	out.println("<b>Intento de tomar la conexion...</b>");
                con = fuenteDatos.getConnection(); // cogemos la conexion
            }

            if(con == null)
            {
                out.println("Error al recuperar la conexion, es nula");
                throw new ServletException("Problemas con la conexion");
            }

            out.println("Preparamos la consulta");

            PreparedStatement pstmt = con.prepareStatement("SELECT * FROM usuarios");
            pstmt.setInt(1,10); // establecemos el entero
            ResultSet results = pstmt.executeQuery();

            while (results.next())
            {
                String id = results.getString(1);
                String titulo = results.getString(2);
                out.println("El titulo es " + titulo + " para id " + id + "");
            }
        }
        catch (Exception e)
        {
            out.println("Error al procesar consulta " + e.getMessage());
        }
        finally  // pase lo que pase retornamos la conexion
        {
            try
            {
                con.close();
            }
            catch (Exception e)
            {
                out.println("Error en proceso " + e.getMessage());
            }
        }
        out.println("-Fin-");  // cerramos la respuesta
         out.close();  // Cerramos buffer
    }
}
el web.xml

Código:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
   <servlet-name>poolBaseDatos</servlet-name>
   <servlet-class>poolBaseDatos</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>poolBaseDatos</servlet-name>
   <url-pattern>/poolBaseDatos</url-pattern>
</servlet-mapping>
<session-config>
 <session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
   <welcome-file>index.jsp</welcome-file>
   <welcome-file>index.html</welcome-file>
   <welcome-file>index.htm</welcome-file>
</welcome-file-list>
<resource-ref>
<res-ref-name>jdbc/Pruebas</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
y el server.xml
Código:
<Context path="/Tomcat6" docBase="tomcat5" debug="0" reloadable="true">
<ResourceParams name="jdbc/Pruebas">
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value>123456</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.sybase.jdbc3.jdbc.SybDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:sybase:Tds:VISTAESCRITORIO:5000/Pruebas</value>
</parameter>
</ResourceParams>
</Context>
Código funciona, el problema es la conexión.
  #2 (permalink)  
Antiguo 30/12/2008, 10:26
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Pregunta Respuesta: Error - Pool de conexiones

También lo intente con este código y nada:

Estoy usando Apache Tomcat 6.0.18 Server.

En mi webapps(o directorio de aplicaciones):
Tengo una carpteta llamada: Pool

Pool
..+
..|
..|
....+ WEB-INF
....|
....|
....+
......web.xml
......+classes
.......|
.......|
.......TestPoolServlet.class

Código:
import java.io.IOException;
import java.io.PrintWriter;
import java.io.IOException;
import java.sql.*;
import javax.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
  
/** 
 * Servlet que usaremos para medir el rendimiento de conexiones con y sin pool de conexiones 
 * @author Carlos García. Autentia. 
 */  
//public class TestPoolServlet extends javax.servlet.http.HttpServlet {
public class TestPoolServlet extends HttpServlet {
      
    private DataSource source;  
  
    /*  
     * Realizamos las tareas de inizialización 
     */  
    public void init(ServletConfig config) throws ServletException {
        super.init();
          
        try {
            // Cargamos el Driver, para los accesos sin pool de conexiones.  
            Class.forName("com.sybase.jdbc3.jdbc.SybDriver");
              
            // Obtenemos el pool.  
            Context initCtx = new InitialContext();
            Context envCtx  = (Context) initCtx.lookup("java:comp/env");
            this.source     = (DataSource) envCtx.lookup("jdbc/Pruebas");         
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
    /*  
     * Realizamos las tarea de conexión con la base de datos. 
     */  
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        Connection conn = null;
        
        response.setContentType("text/html");   // retornamos el tipo de respuesta
        PrintWriter out = response.getWriter();
        
        try {
            response.setStatus(HttpServletResponse.SC_OK);
              
            // ¿ Usamos el Pool de conexiones ?
            boolean usePool = "1".equals(req.getParameter("pool"));
            if (usePool){
                conn = source.getConnection();
                out.println("Prueba con Pool exitosa...");
            } else {
                conn = DriverManager.getConnection("jdbc:sybase:Tds:VISTAESCRITORIO:5000/Pruebas","sa","123456");
                out.println("Prueba sin Pool, no exitosa...");
            }
            if (conn!=null){
            	PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM usuarios");
                pstmt.setInt(1,10); // establecemos el entero
            }
        } catch (Exception ex){  
            response.getWriter().println(ex.getMessage());  
        } finally {  
            try {  
                conn.close();   // Liberamos recursos descartando las excepciones que se pudieran producir  
            } catch (Exception ex){}  
        }  
    }  
}
El web.xml, que se encuentre en mi directorio WEB-INF de mi proyecto.
Código:
<?xml version="1.0" encoding="utf-8"?>  
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      
    <display-name>Test Performance Pool Servlet</display-name>  
      
    <servlet>  
        <servlet-name>TestPoolServlet</servlet-name>  
        <servlet-class>TestPoolServlet</servlet-class>  
    </servlet>  
      
    <servlet-mapping>  
        <servlet-name>TestPoolServlet</servlet-name>  
        <url-pattern>/TestPoolServlet</url-pattern>  
    </servlet-mapping>
	<session-config>
	<session-timeout>30</session-timeout>
	</session-config>
	<welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
	<welcome-file>index.html</welcome-file>
	<welcome-file>index.htm</welcome-file>
</welcome-file-list>
    <resource-ref>  
        <res-ref-name>jdbc/Pruebas</res-ref-name>  
        <res-type>javax.sql.DataSource</res-type>  
        <res-auth>Container</res-auth>  
    </resource-ref>  
      
</web-app>
La configuración de context.xml, creo que es el que se encuentra en el directorio conf. junto al archivo server.xml(O estoy equivocado?).
Código:
	<!--Mi linea de inicializacion persistencia-->
		<Resource name="jdbc/TestPoolServlet" auth="Container" type="javax.sql.DataSource"  
        username="sa" password="123456" driverClassName="com.sybase.jdbc3.jdbc.SybDriver"  
        url="jdbc:sybase:Tds:VISTAESCRITORIO:5000/Pruebas?autoReconnect=true" maxActive="8" maxIdle="8" />
	<!--Fin linea de persistencia-->
El error que me retorna es el siguiente:
Prueba sin Pool, no exitosa... JZ0SB: indice de par?metro fuera de rango: 1.

Naturalmente, deduzco que ingreso por el pool de conexiones si no que uso el tipo normal de conexión por eso el indice esta fuera del rango.
Pero por que no crea esta conexión. Ya copie el conector Jconn3.jar en la carpeta lib de tomcat. Y también lo copie en una carpeta lib dentro de WEB-INF
  #3 (permalink)  
Antiguo 30/12/2008, 15:56
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Respuesta: Error - Pool de conexiones

También intente crear este sistema por Netbeans:

Primero utilice glassFish+Visual web F+El ejemplo MYSQL, me permitía listar las tablas de mi base de datos y todo correcto, luego cree una pagina y todo fue un éxito y lo mismo con derby.

Luego lo hice con Hibernet y Mysql, y también funciono!

Tambien lo intente con Postgresql y siii! todo muy bonito.

Pero devuelta ha sybase, repetí todos los pasos tal como lo hice con Mysql y nada!

Lo probé una vez, dos y tres... ambiando una osa y la otra, y nada.

Intente probar con otro schema ya que antes por defecto se me escribía DBO, y lo intente con public... y nada.

La verdad ya me estoy preocupando, al igual que muchos de los que visitamos este foro...No se que hacer. Me recorrí muchas web, probé mas de un ejemplo... y nada.

Es probable que el error sea algo muy sencillo, y este hay, en mis narices, riendo de mis fracasos.

Última edición por SPAWN3000; 30/12/2008 a las 22:16
  #4 (permalink)  
Antiguo 31/12/2008, 06:07
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error - Pool de conexiones

A ver, este segundo ejemplo es bastante claro y no tiene mucho que ver con la conexión.

1. Te saca ese mensaje porque tú le has dicho que lo saque, no porque realmente falle.

Es decir, sale lo de "Prueba sin pool no exitosa..." porque haces esto:

Código java:
Ver original
  1. boolean usePool = "1".equals(req.getParameter("pool"));
  2. if (usePool){
  3.     conn = source.getConnection();
  4.     out.println("Prueba con Pool exitosa...");
  5. } else {
  6.     conn = DriverManager.getConnection("jdbc:sybase:Tds:VISTAESCRITORIO:5000/Pruebas","sa","123456");
  7.     out.println("Prueba sin Pool, no exitosa...");
  8. }

Que me voy a permitir traducir como:
Código:
si (queremos usar el pool) {
    intentamos usarlo;
    decimos que ha ido bien;
} si no {
    intentamos conectar sin pool;
    decimos que ha ido mal;
}
Es decir, no estás sacando un mensaje u otro según haya ido bien la prueba o no. Lo que estás haciendo es sacar un mensaje u otro según intentes usar el pool o conectar directamente. En cualquiera de los dos casos puede haber funcionado o no funcionado y tú estarás sacando el mensaje sólo según qué es lo que hayas intentado hacer.



El segundo mensaje, este sí que es un mensaje de error, se refiere al preparedStatement, no tiene nada que ver con la conexión.

Haces:
Código java:
Ver original
  1. PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM usuarios");
  2. pstmt.setInt(1,10); // establecemos el entero

Es decir, que estás usando una sentencia de SQL que no necesita ningún parámetro pero tú le estás intentando meter uno con el setInt() ese. Como tu sentencia no tiene parámetros, pues te dice eso, que no existe ningún parámetro de índice 1.



Es más, el hecho de que salga ese error, quiere decir que se están ejecutando esas líneas, y como van dentro de un
Código java:
Ver original
  1. if (conn != null) {
  2.     //...
  3. }

Entonces podemos deducir que sí, conn es distinto de null y por tanto sí, se está consiguiendo conectar correctamente.



Por lo demás, en cuanto al tema de que no encuentre el pool... posiblemente se trate de un problema con la ruta que le pones de búsqueda en el contexto.

Última edición por venkman; 31/12/2008 a las 06:12
  #5 (permalink)  
Antiguo 31/12/2008, 07:44
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 7 meses
Puntos: 51
Respuesta: Error - Pool de conexiones

El mensaje de error "Cannot create JDBC driver of class '' for connect URL 'null'" aparece en Tomcat cuando no esta leyendo bien la definición del DataSource. Es decir, la definición la lee pero no de donde crees y esta leyendo como vacio, '', el nombre del driver y como null la cadena de conexión. Este es un ejemplo claro de lo que definí como "falla más que una escopeta de feria" .

El problema en estos casos se produce por el orden de preferencias que tiene el Tomcat en donde de leer las definiciones del DataSource, ya que hay multiples sitios, y que el Tomcat genera ficheros el solito con algunas de esas definiciones y las deja vacías. Y además depende de como configures tu aplicación, funcionan unas cosas y no otras. Y por ultimo, hay que tener especial cuidado con los nombres y paths del contexto, del datasource, de los ficheros de configuracion del contexto etc. por que tienen que cuadrar todos.

Ese tema es bastante toca-pelotas en el Tomcat, la verdad, y la pena es que en Apache no lo ven así por lo que no tiene visos de mejorar.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 31/12/2008, 13:49
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Respuesta: Error - Pool de conexiones

Nuevamente gracias GreenEyed... Si imagine que el problema es de configuracion.

Te pregunto: Hibernate como lo haría... No en código, si no de que lógica utiliza para no tener que acceder parámetros a ficheros propios de Tomcat, si no hacerlo bajo sus propios métodos.

Me imagino que el no cambia ningún archivo de estos o no?

Última edición por SPAWN3000; 31/12/2008 a las 13:58
  #7 (permalink)  
Antiguo 31/12/2008, 13:51
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Respuesta: Error - Pool de conexiones

Cita:
Iniciado por venkman Ver Mensaje
A ver, este segundo ejemplo es bastante claro y no tiene mucho que ver con la conexión.

1. Te saca ese mensaje porque tú le has dicho que lo saque, no porque realmente falle.

Es decir, sale lo de "Prueba sin pool no exitosa..." porque haces esto:

Código java:
Ver original
  1. boolean usePool = "1".equals(req.getParameter("pool"));
  2. if (usePool){
  3.     conn = source.getConnection();
  4.     out.println("Prueba con Pool exitosa...");
  5. } else {
  6.     conn = DriverManager.getConnection("jdbc:sybase:Tds:VISTAESCRITORIO:5000/Pruebas","sa","123456");
  7.     out.println("Prueba sin Pool, no exitosa...");
  8. }

Que me voy a permitir traducir como:
Código:
si (queremos usar el pool) {
    intentamos usarlo;
    decimos que ha ido bien;
} si no {
    intentamos conectar sin pool;
    decimos que ha ido mal;
}
Es decir, no estás sacando un mensaje u otro según haya ido bien la prueba o no. Lo que estás haciendo es sacar un mensaje u otro según intentes usar el pool o conectar directamente. En cualquiera de los dos casos puede haber funcionado o no funcionado y tú estarás sacando el mensaje sólo según qué es lo que hayas intentado hacer.



El segundo mensaje, este sí que es un mensaje de error, se refiere al preparedStatement, no tiene nada que ver con la conexión.

Haces:
Código java:
Ver original
  1. PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM usuarios");
  2. pstmt.setInt(1,10); // establecemos el entero

Es decir, que estás usando una sentencia de SQL que no necesita ningún parámetro pero tú le estás intentando meter uno con el setInt() ese. Como tu sentencia no tiene parámetros, pues te dice eso, que no existe ningún parámetro de índice 1.



Es más, el hecho de que salga ese error, quiere decir que se están ejecutando esas líneas, y como van dentro de un
Código java:
Ver original
  1. if (conn != null) {
  2.     //...
  3. }

Entonces podemos deducir que sí, conn es distinto de null y por tanto sí, se está consiguiendo conectar correctamente.



Por lo demás, en cuanto al tema de que no encuentre el pool... posiblemente se trate de un problema con la ruta que le pones de búsqueda en el contexto.
No es un problema de logica: Lo he echo de esta forma, para comprobar si realmente esta ingresando por el pool, de otra manera no podría descartarlo ya que de generar un error me tomaría la conexión normal.
  #8 (permalink)  
Antiguo 31/12/2008, 14:21
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Pregunta Respuesta: Error - Pool de conexiones

En esta dirección web, encontré es este articulo que aun no he probado...No se si alguien lo ha intentado. Según entiendo, es crearlo sin afectar los ficheros del tomcat (No se si fue que entendí mal).

http://www.programacion.com/comentarios/id=aplic_jsp&obj=escrito&num=4/

Me interesa su opinión.
  #9 (permalink)  
Antiguo 01/01/2009, 04:45
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error - Pool de conexiones

Cita:
Iniciado por SPAWN3000 Ver Mensaje
No es un problema de logica: Lo he echo de esta forma, para comprobar si realmente esta ingresando por el pool, de otra manera no podría descartarlo ya que de generar un error me tomaría la conexión normal.
Si para ti tiene lógica pues ok. Pero entonces es un problema de que estás sacando un mensaje que no es cierto.

Es decir, estás diciendo "Prueba sin Pool, no exitosa..." y realmente no es que no sea exitosa. La conexión la has obtenido.


Por otro lado, lo del índice fuera de rango es lo del preparedStatement que te decía.
  #10 (permalink)  
Antiguo 01/01/2009, 19:59
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Pregunta Respuesta: Error - Pool de conexiones

Cita:
Iniciado por venkman Ver Mensaje
Si para ti tiene lógica pues ok. Pero entonces es un problema de que estás sacando un mensaje que no es cierto.

Es decir, estás diciendo "Prueba sin Pool, no exitosa..." y realmente no es que no sea exitosa. La conexión la has obtenido.


Por otro lado, lo del índice fuera de rango es lo del preparedStatement que te decía.
Si he obtenido la conexion, pero no tuvo exito en hacerlo por medio del pool que era lo que se buscaba realmente, por tanto no fue exitosa la conexion por el pool...
Solo es un ejemplo (mas no es la clase final naturalmente, por eso me doy el lujo de sacar estos mensajes)que buscaba validar si realmente se puedo implementar un Datasource en Tomcat, pero aun tengo problemas ya que la idea PRACTICA seria crearlo sin tener que alterar archivos propios de tomcat como el server.xml o el context.xml(Pero según GreenEyed esto no funciona de forma óptima en este servidor).

Te agradezco de forma muy cordial tu interes y sabre valorar tu aporte.

Última edición por SPAWN3000; 01/01/2009 a las 20:08
  #11 (permalink)  
Antiguo 02/01/2009, 07:56
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Pregunta Respuesta: Error - Pool de conexiones

Una duda fuera de contexto, como hace uno para otorgarle puntos a alguien?

He buscado la opción, pero no la encuentro...
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 21:58.