Primeros pasos con Spring #6, Base de datos por JNDI
En este punto llegamos a una versión funcional de una aplicación de lista de pendientes, con una API REST que es consumida desde una interfaz web basada en Angular y Bootstrap.
Recordemos que la base de datos que utilizamos es H2 y advertimos era solo de prueba, en esta ocasión configuraremos la conexión a nuestra base de datos mediante JNDI y veremos que es muy sencillo cambiar de una base de datos a otra.
Debemos saber que configurar una base de datos por JNDI es dependiente de cada contenedor de aplicaciones(Tomcat, Wildfly, etc) y el motor de base de datos a utilizar.
El contenedor que usamos es Apache Tomcat y la base de datos MySQL, por lo que es necesario tenerlos instalados previamente.
Algo muy bueno en estos momentos es que podemos utilizar Docker para correr cualquier base de datos en cuestión de segundos, mas información aquí
Dividiremos esto en pasos:
Paso 1:
Agregar el controlador JDBC de MySQL, desde el repositorio de Maven a el pom.xml, podemos eliminar la referencia a la dependencia de H2.
Paso 2:
Crear la carpeta META-INF dentro de la ruta src/main/webapp/
y dentro de ella un archivo llamado context.xml con el siguiente contenido.
<Context path="todo" docBase="todo"
reloadable="true" crossContext="true">
<Resource name="jdbc/Todo" auth="Container"
type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/todo?createDatabaseIfNotExist=true" />
</Context>
La funcionalidad de este archivo consiste en registrar un recurso por JNDI el cual nombramos jdbc/Todo
y agregamos las credenciales ( username="root" password="root"
) así como la URL a nuestra base de datos MySQL (url="jdbc:mysql://localhost:3306/todo?createDatabaseIfNotExist=true"
) y el nombre de la clase del controlador JDBC (driverClassName="com.mysql.jdbc.Driver"
).
Paso 3:
Abriremos el archivo mvc-dispatcher-servlet.xml y modificaremos el bean dataSource por la siguiente linea de código.
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/Todo"/>
Con esta linea especificamos que el dataSource esta dado por un recurso JNDI llamado jdbc/Todo
, se antepone java:comp/env/
debido a la forma en que Apache Tomcat nombra los recursos registrados, mas información aquí.
Paso 4:
Debemos cambiar el dialecto de Hibernate de H2 a MySQL, para eso en el archivo mvc-dispatcher-servlet.xml sustituiremos org.hibernate.dialect.H2Dialect
por org.hibernate.dialect.MySQLDialect
,
De forma opcional podemos cambiar la propiedad que destruye y crea las tablas de Hibernate para que simplemente actualice o valide el esquema de nuestra base de datos, en mi caso utilice update
, podemos ver que hace cada uno de estos valores aquí.
Conclusión:
Por ultimo comprobamos que nuestra base de datos se creo correctamente y que la información esta guardada en ella.
Las modificaciones que se hicieron al código están aquí, el código fuente y las imágenes de el proyecto hasta este punto se encuentran aquí.