Configurar Tomcat/Ubuntu para que use Mysql

De ChuWiki

Dejar que Tomcat controle las conexiones con base de datos[editar]

Cuando hacemos una aplicación web con Tomcat, nuestro código java/jsp puede acceder directamente a la base de datos, creando sus propias Connection a partir del driver de MySQL. Sin embargo, tenemos una forma más elegante de hacer estas cosas. Podemos configurar Tomcat para que tenga acceso a la base de datos y que las aplicaciones le pidan a Tomcat la conexión, sin preocuparse del driver, base de datos, usuario ni password, etc, etc.

Esta opción es más elegante y eficiente por los siguientes motivos:

  • La aplicación web no tiene que saber nada de la base de datos que hay detrás. Ni la cadena de conexión, ni el usuario y password, ni siquiera qué tipo de base de datos hay detras (MySQL, Oracle, etc). Lo único que tiene que saber es que hay una base de datos disponible que gestiona Tomcat y que el nombre con el que se la debe pedir (un nombre JNDI).
  • Tomcat gestiona la conexión a la base de datos, metiéndola en un Pool de conexiones. Esto hace más eficiente al servidor, ya que las conexiones se reaprovechan entre varias aplicaciones web y entre varias sesiones de la misma aplicación. Crear y cerrar una conexión con base de datos es un proceso costoso y si lo hace la aplicación cada vez que necesita hacer una transacción, todo el proceso es más lento.

Veamos aquí cómo hacer accesible a Tomcat nuestra base de datos MySQL y cómo hacer que una aplicación web que hagamos le pida a Tomcat una conexión con dicha base de datos.


Poner el driver de MySQL en su sitio[editar]

Para que Tomcat tenga acceso al driver de MySQL, debemos poner el jar con el mismo en el directorio adecuado de Tomcat. En mi caso, el driver está en el jar mysql-connector-java-5.0.8-bin.jar y hay que situarlo en /usr/share/tomcat5.5/common/lib.


Dar de alta la base de datos[editar]

Ahora debemos proporcionar a Tomcat todos los datos para la conexión con la base de datos. Para ello, editamos el fichero /etc/tomcat5.5/context.xml y añadimos al final algo como esto

<Context path="/protocolo-pruebas" docBase="protocolo-pruebas"
   debug="5" reloadable="true" crossContext="true">

   <WatchedResource>WEB-INF/web.xml</WatchedResource>

   <Resource name="jdbc/PROTO_PRUEBAS" 
      auth="Container"
      type="javax.sql.DataSource" 
      username="elusuario" 
      password="secreto"
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/BASE_DATOS"
      maxActive="8" maxIdle="4"/>

</Context>
  • En este ejemplo, la aplicación se llamara protocolo-pruebas y el path para acceder a ella desde el navegador será http://localhost:8180/protocolo-pruebas.
  • El jdbc/PROTO_PRUEBAS es el nombre que hemos decidido para referenciar nuestra conexión con la base de datos y es el nombre que debe saber la aplicación.
  • El usuario y la password serán las de acceso a la base de datos.
  • driverClassName es el nombre de la clase para la conexión con MySQL.
  • La url es la de la conexión con la base de datos.

Otra opción para tocar este fichero, si tenemos instalada la aplicación de administración de Tomcat desde navegador, es entrar en ella y en el arbol de la izquierda buscar "Tomcat Server", "Servicio (Catalina)", "Host (localhost)", "Context (/protocolo-pruebas)", "Recursos", "Fuentes de datos". En el panel que sale en el lado derecho, en "acciones disponibles", podemos "crear nueva fuente de datos" y rellenar los campos del formulario. Estos datos se escribirán en el fichero context.xml, de forma similar al ejemplo anterior.

En el enlace tienes un video de cómo hacerlo http://www.youtube.com/watch?v=le6zOUu4usE

Dar permisos a la aplicación para acceder a la base de datos[editar]

Para que nuestra aplicación web pueda abrir el socket con la base de datos, debemos darle permisos. Tomcat lee los permisos de /etc/tomcat5.5/catalina.policy, pero este fichero se regenera automáticamente en el arranque de Tomcat con la información que hay en los ficheros en el directorio /etc/tomcat5.5/policy.d, así que debemos tocar en los ficheros de ahí dentro, y no directamente en catalina.policy.

En concreto, para dar permisos a nuestra aplicación, debemos editar con permisos de administrador el fichero /etc/tomcat5.5/policy.d/04webapps.policy. En él, añadimos esto al final

grant codeBase "file:/var/lib/tomcat5.5/webapps/protocolo-pruebas/-" {
   permission java.net.SocketPermission "localhost:3306", "connect,resolve";
};

donde, como antes, protocolo-pruebas es el directorio donde está nuestra aplicación y el - es para incluir en los permisos a los ficheros en ese directorio hacia abajo. Estamos dando permisos para abrir el puerto 3306 (el de MySQL por defecto) en localhost.


Configurar la aplicación para acceder a la base de datos[editar]

En el fichero WEB-INF/web.xml debemos poner algo como esto

<web-app>
  ...
  <resource-ref>
     <description>La base de datos</description>
     <res-ref-name>jdbc/PROTO_PRUEBAS</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
   </resource-ref>
   ...
</web-app>

En él indicamos que hay un recurso, de nombre jdbc/PROTO_PRUEBAS, que es el nombre que dimos en el fichero context.xml, que es de tipo javax.sql.DataSource, que es la clase java a la que pediremos la conexión con la base de datos.


Hacer el código[editar]

Ahora sólo nos queda hacer el código java de nuestra aplicación, dentro de un Servlet, un jsp o una clase java normal ejecutada desde la aplicación web. El código sería este

// Esta parte es fija
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// Y aquí pedimos nuestra conexión, por su nombre
DataSource ds = (DataSource) envCtx.lookup("jdbc/PROTO_PRUEBAS");
Connection conexion = ds.getConnection();

// Aquí la transacción con la base de datos

// Se cierra la conexión, ya que estamos en un pool de conexiones
// para dejarla libre a otros procesos.
conexion.close();