package io.dropwizard.db;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.MetricRegistry;
import org.apache.tomcat.jdbc.pool.ConnectionPool;
import org.apache.tomcat.jdbc.pool.DataSourceProxy;
import org.apache.tomcat.jdbc.pool.PoolConfiguration;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
import static com.codahale.metrics.MetricRegistry.name;
/**
* A {@link ManagedDataSource} which is backed by a Tomcat pooled {@link javax.sql.DataSource}.
*/
public class ManagedPooledDataSource extends DataSourceProxy implements ManagedDataSource {
private final MetricRegistry metricRegistry;
/**
* Create a new data source with the given connection pool configuration.
*
* @param config the connection pool configuration
*/
public ManagedPooledDataSource(PoolConfiguration config, MetricRegistry metricRegistry) {
super(config);
this.metricRegistry = metricRegistry;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
throw new SQLFeatureNotSupportedException("Doesn't use java.util.logging");
}
@Override
public void start() throws Exception {
final ConnectionPool connectionPool = createPool();
metricRegistry.register(name(getClass(), connectionPool.getName(), "active"),
(Gauge<Integer>) connectionPool::getActive);
metricRegistry.register(name(getClass(), connectionPool.getName(), "idle"),
(Gauge<Integer>) connectionPool::getIdle);
metricRegistry.register(name(getClass(), connectionPool.getName(), "waiting"),
(Gauge<Integer>) connectionPool::getWaitCount);
metricRegistry.register(name(getClass(), connectionPool.getName(), "size"),
(Gauge<Integer>) connectionPool::getSize);
}
@Override
public void stop() throws Exception {
close();
}
}