Liferay 7.1. HikariCP
Después de cierto tiempo: Liferay 7.1. HikariCP. Un nuevo artículo sobre Liferay. Por unas razones u otras, me es muy complicado escribir en el blog. Afortunadamente, en esta ocasión no han sido temas de salud si no todo lo contrario: un viaje de placer que, inesperadamente, me ha reportado ánimos para continuar con este proyecto.
Mi estancia en Perú de casi un mes, trabando nuevas amistades y consolidando otras que ya tenía, me ha permitido sin comerlo ni beberlo, hablar sobre este proyecto. Varios de ellos muy relacionados con el mundo de la informática o con la enseñanza en ámbitos de nuevas tecnologías, han coincidido en que el aprendizaje en línea de temas como el desarrollo en informática, está experimentando un gran auge y va a seguir aumentando. Lo que más les gusta es la facilidad con que llega a cualquiera, incluso a personas con pocos recursos que de otra forma sería impensable.
Todos los obstáculos parecen menos cuando oyes que lo que estás haciendo es buena idea y que además, aunque sea de forma tímida, ayuda a los demás. Un afectuoso saludo para todos ellos.
Y aquí estamos con otro artículo sobre Liferay, bendición para algunos, pesadilla para muchos. Espero que los cursos y el libro que estoy preparando cubra muchas necesidades que veo en el día a día. En esta ocasión hablo sobre HikariCP que, si bien no tiene nada que ver en principio con Liferay, a partir de la versión 7.x comienza a utilizarse por defecto como su pool de conexiones.
¿Qué es HikariCP?
Resumiendo: se trata de otro framework más cuyo trabajo es actuar como pool de conexiones JDBC en aplicaciones Java.
¿Por qué dedicarle entonces un artículo? No es por nada que Liferay lo decidiera utilizar a partir de la versión 7.x. Es más rápido…, muuuucho más rápido que otros competidores (amén de alguna otra característica adicional). Mirad este gráfico:

Lo podéis consultar directamente en la web del proyecto .
Y aquí, directamente el proyecto en GitHub .
Otras URLs útiles pueden ser:
– El grupo de discusión en Google .
¿Cómo usar HikariCP en una aplicación Java?
Pues lo primero que tenemos que hacer es crear una instancia única de un DataSource:
public class DataSource {
private static HikariConfig configuracion = new HikariConfig();
private static HikariDataSource dataSource;
static {
configuracion.setJdbcUrl( "cadenJDBC" ); // Aquí la URL de conexión JDBC.
configuracion.setUsername( "usuario" ); // Aquí estaría el usuario.
configuracion.setPassword( "clave" ); // Aquí la clave.
configuracion.addDataSourceProperty( "cachePrepStmts" , "true" );
configuracion.addDataSourceProperty( "prepStmtCacheSize" , "250" );
configuracion.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );
dataSource = new HikariDataSource( configuracion );
}
private DataSource() {}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
HikariCP dispone de muchas propiedades que no se encuentran en otras herramientas similares y que le permiten cosas que otros no, como detectar fugas de conexión por sí mismo. El conjunto de estas propiedades se pueden encontrar aquí: https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby .
En el ejemplo más arriba, disponemos las propiedades que necesitamos para el proyecto directamente, usando el objeto configuración. Sin embargo, es posible dotar la configuración de dos formas diferentes:
- Fichero properties. Mediante un fichero properties ubicado en la carpeta resources del proyecto. Ejemplo:
// Un supuesto fichero ds.properties: private static HikariConfig configuracion = new HikariConfig("ds.properties" ); // Cuando instanciamos configuración, ahora indicamos el fichero properties que contiene las propiedades. // Las propiedades en el fichero ds.properties se indican más o menos: datasource.username=usuario datasource.password=clave ... // ... Y el resto de propiedades que necesitásemos
- Configuración basada en java.util.Properties:
Properties props = new Properties(); props.setProperty( "dataSource.username" , "valor" ); props.setProperty( "dataSource.password" , "valor" ); // ... Resto de propiedades... private static HikariConfig configuracion = new HikariConfig( props );
Posteriormente, solo tendríamos que usar el objeto dataSource para trabajar con la base de datos apuntada en la URL JDBC, indicada en la configuración. Algo como: Connection con = dataSource.getConnection();
Evidentemente, son necesarios conocimientos previos avanzados sobre Java, J2EE, etc.
Dependencias
Con Java 8, 9 y Maven:
com.zaxxer
HikariCP
2.7.8
compile
Con Java 7 u 8 y Maven:
com.zaxxer
HikariCP-java7
2.4.13
compile
Con Java 6 y Maven:
com.zaxxer
HikariCP-java6
2.3.13
compile
Pool de conexiones en Liferay 7.1
Hasta la versión 7, Liferay utilizaba la herramienta C3P0 como framework por defecto para el pool de conexiones JDBC. Ya hemos visto la gráfica comparativa.
Cambiar la herramienta para pool de conexiones por defecto
Sea como sea, si queremos cambiar el pool de conexiones por defecto, debemos extender un viejo conocido: el fichero portal.properties. Para ello, crearemos o modificaremos el fichero portal-ext.properties y descomentaremos la línea que necesitemos (comentaremos las otras):
### Esto se encuentra en el fichero portal.properties:
#jdbc.default.liferay.pool.provider=c3po
#jdbc.default.liferay.pool.provider=dbcp
jdbc.default.liferay.pool.provider=hikaricp
#jdbc.default.liferay.pool.provider=tomcat
Dependiendo del pool de conexiones elegido, es posible que deba realizar más modificaciones mediante portal-ext.properties, en el servidor de aplicaciones elegido, etc.
¿Y si tengo unas definiciones JNDI en Tomcat que debo utilizar?
Existen bastantes proyectos Liferay que utilizan Tomcat como servidor de aplicaciones, incluso en producción. De hecho, se siguen implementando proyectos con las nuevas versiones de Liferay. Es frecuente encontrarnos con que en Tomcat están definidos JNDI para enmascarar a la aplicación web, los datos de conexión a bases de datos. La pregunta que surge aquí es: ¿cómo hacemos entonces para utilizar esas definiciones junto con HikariCP?
En resumen, tenemos que traernos el JAR correspondiente (cuidado con la versión) de HikariCP (nos ayudará, utilizar Maven) a la carpeta /lib/ext de Tomcat. Posteriormente, modificamos las definiciones JNDI para que apunten a la base de datos que utiliza nuestra instancia de Liferay e indicamos que utilice HikariCP. Existe una entrada que explica esto, en el blog de un viejo conocido en el mundo Liferay: Dave Nebinger .
Conclusión
No pretende este artículo mostrar el uso de HikariCP a fondo. Simplemente dar a conocer otra de las herramientas que usa Liferay actualmente y que no se suele mencionar que está ahí y lo que puede ofrecer.
Conocer estas herramientas es conocer un poco más de Liferay. Esto nos ayudará en nuestro día a día con este gestor de portales.
Nada más, un saludo y hasta otra.