The main goal of this module is to expose a HikariCP
DataSource through dependency injection.
Moreover this module contains an API to simplify the use of a transaction over a JDBC connection.
This API is available in the TransactionManager class.
The configuration is based on the Plume Config module
and more specificaly the com.typesafe.config.Config object.
By default, all keys right under db.hikari are directly passed to Hikari. For example:
db.hikari.dataSourceClassName="oracle.jdbc.pool.OracleDataSource"
db.hikari."dataSource.url"="jdbc:oracle:thin:@localhost:1521:orcl"
db.hikari."dataSource.user"=login
db.hikari."dataSource.password"=password
db.hikari.minimumIdle=1
db.hikari.maximumPoolSize=4
db.hikari.leakDetectionThreshold=30000
db.hikari.idleTimeout=20000Do note that subkeys should be wrapped inside quotes, so db.hikari.minimumIdle=1 is ok
but db.hikari.dataSource.user=login is not ok, instead it should be written
db.hikari."dataSource.user"=login.
To connect to several databases, you have to extend TransactionManager
and configure which Config prefix should be read.
For example, if you have 2 databases stats and product, you will need to create 2 classes:
@Singleton
public class StatsTransactionManager extends TransactionManager {
@Inject
public StatsTransactionManager(Config config) {
super(config, "db.stats");
}
}and
@Singleton
public class ProductTransactionManager extends TransactionManager {
@Inject
public ProductTransactionManager(Config config) {
super(config, "db.product");
}
}This way you can configure your 2 connections with:
# stats database
db.stats.hikari.dataSourceClassName="oracle.jdbc.pool.OracleDataSource"
db.stats.hikari."dataSource.url"="jdbc:oracle:thin:@localhost:1521:orcl"
db.stats.hikari."dataSource.user"=login
db.stats.hikari."dataSource.password"=password
# product database
db.product.hikari.dataSourceClassName="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
db.product.hikari."dataSource.url"="jdbc:mysql://localhost/product"
db.product.hikari."dataSource.user"=login
db.product.hikari."dataSource.password"=passwordNow when you want to use the stats database, just reference the StatsTransactionManager:
@Singleton
public class VisitDao {
private final StatsTransactionManager transactionManager;
@Inject
public VisitDao(StatsTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public long countVisits(LocalDate day) {
return transactionManager.executeAndReturn(connection -> {
try(PreparedStatement statement
= connection.prepareStatement("SELECT COUNT(*) FROM VISIT WHERE DAY = ?")) {
// ...
}
});
}
}If you are using Plume Querydsl,
you should extend TransactionManagerQuerydsl instead of TransactionManager:
@Singleton
public class StatsTransactionManager extends TransactionManagerQuerydsl {
@Inject
public StatsTransactionManager(Config config) {
super(config, "db.stats");
}
}