An extension module that provides a
DataSource
from a HikariCP JDBC connection pool.
This is a ConfigurableModule
, exposing the HikariConfig
type as the configuration.
All aspects of the connection pool can be configured through this object.
See ConfigurableModule
for usage patterns.
import ratpack.server.Service;
import ratpack.server.StartEvent;
import ratpack.guice.Guice;
import ratpack.hikari.HikariModule;
import ratpack.test.embed.EmbeddedApp;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import static org.junit.Assert.*;
public class Example {
static class InitDb implements Service {
public void onStart(StartEvent startEvent) throws Exception {
DataSource dataSource = startEvent.getRegistry().get(DataSource.class);
try (Connection connection = dataSource.getConnection()) {
connection.createStatement().executeUpdate("create table if not exists val(ID INT PRIMARY KEY, val VARCHAR(255));");
}
}
}
public static void main(String... args) throws Exception {
EmbeddedApp.of(s -> s
.registry(Guice.registry(b -> b
.module(HikariModule.class, hikariConfig -> {
hikariConfig.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource");
hikariConfig.addDataSourceProperty("URL", "jdbc:h2:mem:dev"); // Use H2 in memory database
})
.bind(InitDb.class)
))
.handlers(chain -> chain
.post("set/:val", ctx ->
ctx.blocking(() -> {
try (Connection connection = ctx.get(DataSource.class).getConnection()) {
PreparedStatement statement = connection.prepareStatement("merge into val (id, val) key(id) values (?, ?)");
statement.setInt(1, 1);
statement.setString(2, ctx.getPathTokens().get("val"));
return statement.executeUpdate();
}
}).then(result ->
ctx.render(result.toString())
)
)
.get("get", ctx ->
ctx.blocking(() -> {
try (Connection connection = ctx.get(DataSource.class).getConnection()) {
PreparedStatement statement = connection.prepareStatement("select val from val where id = ?");
statement.setInt(1, 1);
ResultSet resultSet = statement.executeQuery();
resultSet.next();
return resultSet.getString(1);
}
}).then(ctx::render)
)
)
).test(httpClient -> {
httpClient.post("set/foo");
assertEquals("foo", httpClient.getText("get"));
});
}
}