package org.n3r.eql.mtcp.impl; import com.alibaba.druid.pool.DruidDataSource; import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; import lombok.extern.slf4j.Slf4j; import org.n3r.eql.mtcp.DataSourceConfigurator; import org.n3r.eql.util.O; import javax.sql.DataSource; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import static com.codahale.metrics.MetricRegistry.name; @Slf4j public class DruidDataSourceConfigurator implements DataSourceConfigurator { DruidDataSource druidDataSource = new DruidDataSource(); @Override public void prepare(String tenantId, Map<String, String> props, MetricRegistry metricsRegistry, ScheduledExecutorService destroyScheduler) { createDruidDataSource(props, destroyScheduler); registerMetrics(tenantId, metricsRegistry); } private void createDruidDataSource(Map<String, String> props, ScheduledExecutorService destroyScheduler) { O.populate(druidDataSource, props); druidDataSource.setDestroyScheduler(destroyScheduler); } @Override public DataSource getDataSource() { return druidDataSource; } public void registerMetrics(String tenantId, MetricRegistry metricsRegistry) { String simpleName = DruidDataSource.class.getSimpleName(); Gauge<Long> connectCount = new Gauge<Long>() { @Override public Long getValue() { return druidDataSource.getConnectCount(); } }; metricsRegistry.register(name(simpleName, tenantId, "connectCount"), connectCount); Gauge<Long> destroyCount = new Gauge<Long>() { @Override public Long getValue() { return druidDataSource.getDestroyCount(); } }; metricsRegistry.register(name(simpleName, tenantId, "destroyCount"), destroyCount); Gauge<Integer> activeCount = new Gauge<Integer>() { @Override public Integer getValue() { return druidDataSource.getActiveCount(); } }; metricsRegistry.register(name(simpleName, tenantId, "activeCount"), activeCount); Gauge<Integer> poolingCount = new Gauge<Integer>() { @Override public Integer getValue() { return druidDataSource.getPoolingCount(); } }; metricsRegistry.register(name(simpleName, tenantId, "poolingCount"), poolingCount); } @Override public void destory(String tenantId, MetricRegistry metricsRegistry) { unregisterMetrics(tenantId, metricsRegistry); destoryDatasource(); } private void destoryDatasource() { try { druidDataSource.close(); druidDataSource = null; } catch (Exception e) { log.error("close druidDataSource error", e); } } private void unregisterMetrics(String tenantId, MetricRegistry metricsRegistry) { String simpleName = DruidDataSource.class.getSimpleName(); metricsRegistry.remove(name(simpleName, tenantId, "connectCount")); metricsRegistry.remove(name(simpleName, tenantId, "destroyCount")); metricsRegistry.remove(name(simpleName, tenantId, "activeCount")); metricsRegistry.remove(name(simpleName, tenantId, "poolingCount")); } }