All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yammer.dropwizard.db.ManagedDataSourceFactory Maven / Gradle / Ivy

The newest version!
package com.yammer.dropwizard.db;

import org.apache.tomcat.dbcp.dbcp.DriverManagerConnectionFactory;
import org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory;
import org.apache.tomcat.dbcp.pool.impl.GenericObjectPool;

import java.util.Map;
import java.util.Properties;

import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.Gauge;

public class ManagedDataSourceFactory {
    public ManagedDataSource build(DatabaseConfiguration configuration) throws ClassNotFoundException {
        Class.forName(configuration.getDriverClass());
        final GenericObjectPool pool = buildPool(configuration);

        final Properties properties = new Properties();
        for (Map.Entry property : configuration.getProperties().entrySet()) {
            properties.setProperty(property.getKey(), property.getValue());
        }
        properties.setProperty("user", configuration.getUser());
        properties.setProperty("password", configuration.getPassword());

        final DriverManagerConnectionFactory factory = new DriverManagerConnectionFactory(
                configuration.getUrl(),
                properties);


        final PoolableConnectionFactory connectionFactory = new PoolableConnectionFactory(factory,
                                                                                          pool,
                                                                                          null,
                                                                                          configuration.getValidationQuery(),
                                                                                          configuration.getConnectionInitializationStatements(),
                                                                                          configuration.isDefaultReadOnly(),
                                                                                          true);
        connectionFactory.setPool(pool);

        setupGauges(pool, configuration.getUrl());

        return new ManagedPooledDataSource(pool);
    }

    private GenericObjectPool buildPool(DatabaseConfiguration configuration) {
        final GenericObjectPool pool = new GenericObjectPool(null);
        pool.setMaxWait(configuration.getMaxWaitForConnection().toMilliseconds());
        pool.setMinIdle(configuration.getMinSize());
        pool.setMaxActive(configuration.getMaxSize());
        pool.setMaxIdle(configuration.getMaxSize());
        pool.setTestWhileIdle(configuration.isCheckConnectionWhileIdle());
        pool.setTimeBetweenEvictionRunsMillis(configuration.getCheckConnectionHealthWhenIdleFor()
                                                           .toMilliseconds());
        pool.setMinEvictableIdleTimeMillis(configuration.getCloseConnectionIfIdleFor()
                                                        .toMilliseconds());
        pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK);
        return pool;
    }

    private void setupGauges(final GenericObjectPool pool, String scope) {
        Metrics.newGauge(ManagedPooledDataSource.class, "numActive", scope, new Gauge() {
            @Override
            public Integer value() {
                return pool.getNumActive();
            }
        });

        Metrics.newGauge(ManagedPooledDataSource.class, "numIdle", scope, new Gauge() {
            @Override
            public Integer value() {
                return pool.getNumIdle();
            }
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy