microBean Hikari Connection Pool CDI Extension

Build Status Maven Central

The microBean Hikari Connection Pool CDI Extension project integrates the Hikari connection pool into CDI 2.0 SE environments.

Installation

To install the microBean Hikari Connection Pool CDI Extension project, ensure that it and its dependencies are present on the classpath at runtime. In Maven, your dependency stanza should look like this:

<dependency>
  <groupId>org.microbean</groupId>
  <artifactId>microbean-datasource-cdi-hikaricp</artifactId>
  <!-- See http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.microbean%22%20AND%20a%3A%22microbean-datasource-cdi-hikaricp%22 for available releases. -->
  <version>0.1.4</version>
  <type>jar</type>
  <scope>runtime</scope>
</dependency>

Releases are available in Maven Central. Snapshots are available in Sonatype Snapshots.

You will also need a JDBC driver implementation on your classpath as well at runtime.

Usage

The microBean Hikari Connection Pool CDI Extension project works, essentially, by satisfying DataSource injection points. That is, in your CDI 2.0 SE application somewhere, if you do:

@Inject
@Named("test")
private DataSource ds;

…this project will arrange for a DataSource named test backed by the Hikari connection pool to be assigned to this ds field in application scope. If you do:

@Inject
private DataSource orders;

…this project will arrange for a DataSource named orders backed by the Hikari connection pool to be assigned to this orders field in application scope.

For such injection points to be satisfied, the microBean Hikari Connection Pool CDI Extension project needs to understand how to configure any particular named DataSource implementation that will be injected. To do this, it looks for DataSourceDefinition annotations and datasource.properties classpath resources.

Any type-level DataSourceDefinition annotations that are encountered are processed. Then datasource.properties classpath resources are sought and loaded, and their properties are processed in the manner described below.

Properties in each datasource.properties file are inspected if they start with either javax.sql.DataSource. or com.zaxxer.hikari.HikariDataSource., followed by a datasource name that does not contain a period (‘.’), followed by a period (‘.’), followed by the name of a Hikari connection pool configuration setting.

Properties are not read until all datasource.properties classpath resources have been effectively combined together.

datasource.properties classpath resources override DataSourceDefinition annotation values.

For each distinct data source name, a HikariDataSource is created and made available in application scope with a Named qualifier whose value is set to the data source name. That DataSource implementation will then be configured by applying all the relevant property suffixes after the first .dataSource. string. So, for example, the property javax.sql.DataSource.test.dataSource.url=jdbc:h2:mem:temp will result in a HikariDataSource implementation named test, with the Hikari connection pool setting named dataSource.url set to jdbc:h2:mem:temp.

Here is an example of a datasource.properties file that works with the in-memory variant of the H2 database:

javax.sql.DataSource.test.dataSourceClassName=org.h2.jdbcx.JdbcDataSource
javax.sql.DataSource.test.dataSource.url=jdbc:h2:mem:test
javax.sql.DataSource.test.username=sa
javax.sql.DataSource.test.password=

Here is an example of a similar datasource.properties file that declares two datasources:

javax.sql.DataSource.test.dataSourceClassName=org.h2.jdbcx.JdbcDataSource
javax.sql.DataSource.test.dataSource.url=jdbc:h2:mem:test
javax.sql.DataSource.test.username=sa
javax.sql.DataSource.test.password=

javax.sql.DataSource.prod.dataSourceClassName=org.h2.jdbcx.JdbcDataSource
javax.sql.DataSource.prod.dataSource.url=jdbc:h2:mem:test
javax.sql.DataSource.prod.username=production
javax.sql.DataSource.prod.password=s3kret