package com.vladmihalcea.flexypool.adaptor;
import com.vladmihalcea.flexypool.common.ConfigurationProperties;
import com.vladmihalcea.flexypool.metric.Metrics;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.SQLTimeoutException;
import java.sql.SQLTransientConnectionException;
import java.util.regex.Pattern;
/**
* <code>HikariCPPoolAdapter</code> extends {@link AbstractPoolAdapter} and it adapts the required API to
* communicate with the HikariCP {@link HikariDataSource}
*
* @author Vlad Mihalcea
* @since 1.0
*/
public class HikariCPPoolAdapter extends AbstractPoolAdapter<HikariDataSource> {
public static final String SQL_TIMEOUT_EXCEPTION_CLASS_NAME = SQLTimeoutException.class.getName();
public static final String SQL_TRANSIENT_CONNECTION_EXCEPTION_CLASS_NAME = SQLTransientConnectionException.class.getName();
public static final String ACQUIRE_TIMEOUT_MESSAGE = "Timeout of .*?ms encountered waiting for connection\\.";
/**
* Singleton factory object reference
*/
public static final PoolAdapterFactory<HikariDataSource> FACTORY = new PoolAdapterFactory<HikariDataSource>() {
@Override
public PoolAdapter<HikariDataSource> newInstance(
ConfigurationProperties<HikariDataSource, Metrics, PoolAdapter<HikariDataSource>> configurationProperties) {
return new HikariCPPoolAdapter(configurationProperties);
}
};
/**
* Init constructor
*/
public HikariCPPoolAdapter(ConfigurationProperties<HikariDataSource, Metrics, PoolAdapter<HikariDataSource>> configurationProperties) {
super(configurationProperties);
}
/**
* {@inheritDoc}
*/
@Override
public int getMaxPoolSize() {
return getTargetDataSource().getMaximumPoolSize();
}
/**
* {@inheritDoc}
*/
@Override
public void setMaxPoolSize(int maxPoolSize) {
getTargetDataSource().setMaximumPoolSize(maxPoolSize);
}
/**
* {@inheritDoc}
*/
@Override
protected boolean isAcquireTimeoutException(Exception e) {
return SQL_TIMEOUT_EXCEPTION_CLASS_NAME.equals(e.getClass().getName()) ||
SQL_TRANSIENT_CONNECTION_EXCEPTION_CLASS_NAME.equals(e.getClass().getName()) ||
(e.getMessage() != null && Pattern.matches(ACQUIRE_TIMEOUT_MESSAGE, e.getMessage()));
}
}