Problemas con el pool de conexiones en tomcat

Zot24

Lanero Novato
12 Jul 2005
23
Estoy intentando cambiar una aplicacion web en jsp con conexiones a mysql para
que use un pool de conexiones en lugar de establecer una conexión nueva en cada
petición. He estado leyendo por internet y he hecho todo lo que he encontrado,
pero me encuentro un error que no sé por qué se produce. Tal vez podais
ayudarme.
La aplicación está instalada en el directorio C:\Archivos de programa\Apache
Software Foundation\Tomcat 5.5\webapps\gpool. He añadido al server.xml el
siguiente context:
<Context path="/gpool" docBase="gpool" debug="0"
reloadable="true" >
<Resource
name="jdbc/gpool" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="gpool" password="pool"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1/gpool?autoReconnect=true">
</Context>

El fichero index.jsp incluye un fichero conectar.jsp, que realiza la conexión
utilizando el pool con el siguiente código:
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.*" %>
<%
Context ctx = new InitialContext();
DataSource fuenteDatos = (DataSource) ctx.lookup("java:comp/env/jdbc/gpool");
con = fuenteDatos.getConnection();
s = con.createStatement();
%>

En el directorio C:\Archivos de programa\Apache Software Foundation\Tomcat
5.5\common\lib he copiado el fichero mysql-connector-java-3.1.10-bin.jar. Al
reiniciar el tomcat y acceder a la página web me da el siguiente error:
javax.servlet.ServletException: El nombre jdbc no este asociado a este contexto
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:3753)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
causa raíz
javax.naming.NameNotFoundException: El nombre jdbc no este asociado a este contexto
org.apache.naming.NamingContext.lookup(NamingContext.java:769)
org.apache.naming.NamingContext.lookup(NamingContext.java:139)
org.apache.naming.NamingContext.lookup(NamingContext.java:780)
org.apache.naming.NamingContext.lookup(NamingContext.java:139)
org.apache.naming.NamingContext.lookup(NamingContext.java:780)
org.apache.naming.NamingContext.lookup(NamingContext.java:152)
org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)
javax.naming.InitialContext.lookup(Unknown Source)
org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:354)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

No sé lo que puede estar mal. Ésto lo he hecho sin crear ningún web.xml en la
aplicación. También he intentado crear uno en el directorio C:\Archivos de
programa\Apache Software Foundation\Tomcat 5.5\webapps\gpool\WEB-INF con el
siguiente contenido:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<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/gpool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Pero entonces me da el siguiente error:
javax.servlet.ServletException: Cannot create JDBC driver of class '' for connect URL 'null'
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:3753)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

causa raíz
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:356)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
La versión de tomcat que estoy usando es la 5.5.9. Si me pudierais ayudar os lo
agradecería.
Saludos.
 
Yo te haria dos sugerencias para que las ensayes:

1. El context no lo hagas en el server.xml, no simpre tienes acceso a ese archivo mejor haslo en context.xml

y ubicalo bajo tu ruta principal en la carpeta /META-INF/context.xml

2. la conexion yo la hago de esta manera :

Context initContext = new InitialContext();
Context ctx = (Context)initContext.lookup("java:/comp/env");
dataSource = (javax.sql.DataSource)ctx.lookup("jdbc/Bd");
conn = dataSource.getConnection();

Espero te sirva de halgo, saludos
 
Muchas gracias. Ya lo he solucionado, pero ahora tengo otro problema.

Me funciona para mysql, pero ahora no consigo hacer que funcione con
oracle.
He creado el siguiente contexto en el server.xml:
<Context path="/ganaderia" docBase="ganaderia" debug="0"
reloadable="true" >

<Resource
name="jdbc/gpool" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="gpool" password="gpool"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:eek:racle:thin:mad:127.0.0.1:1521:GLOBALDB" />

</Context>

Y he hecho una página de prueba tan sencilla como esto:
<html>
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.*" %>
Opciones<br><br>
<%
try
{
Context initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup("java:/comp/env");
DataSource fuenteDatos = (DataSource) ctx.lookup("/jdbc/ganaderia");
Connection con = fuenteDatos.getConnection();
Statement s = con.createStatement();
String query = "select idOpcion, texto from opciones";
ResultSet r = s.executeQuery(query);
String opcion, texto;
while(r.next())
{
opcion = r.getString(1);
texto = r.getString(2);%>
<%= opcion + ": " + texto %><br><%
}
r.close();
}
catch(Exception e)
{%>
<%= "<br>Excepción: " + e + "<br>" %><%
}%>
</body>
</html>

No me da ningún error, pero la página sale vacía. Como si no leyera nada de la
conexión. Lo he comprobado con el SQLPlus Worksheet y en la tabla hay datos.
El web.xml está en su sitio y es el mismo que he usado para mysql.
Si alguien sabe lo que está pasando se lo agradecería.

Saludos.
 

Los últimos temas