/** * */ package org.minnal.core.db; import javax.sql.DataSource; import org.minnal.core.MinnalException; import org.minnal.core.config.DatabaseConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.annotation.JsonValue; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.mchange.v2.c3p0.PooledDataSource; /** * @author ganeshs * */ public class C3P0DataSourceProvider implements DataSourceProvider { private DatabaseConfiguration configuration; private PooledDataSource dataSource; private DataSourceStatistics statistics; private static final Logger logger = LoggerFactory.getLogger(C3P0DataSourceProvider.class); public C3P0DataSourceProvider() { } public C3P0DataSourceProvider(DatabaseConfiguration configuration) { this.configuration = configuration; } @Override public DataSource getDataSource() { if (dataSource == null) { dataSource = createDataSource(); statistics = new C3P0DataSourceStatistics(dataSource); } return dataSource; } protected PooledDataSource createDataSource() { logger.info("Creating the data source with the configuration {}", configuration); if (configuration == null) { logger.error("Database configuration is not set"); throw new MinnalException("Database configuration is not set"); } ComboPooledDataSource dataSource = new ComboPooledDataSource(); try { Class.forName(configuration.getDriverClass()); dataSource.setJdbcUrl(configuration.getUrl()); dataSource.setUser(configuration.getUsername()); dataSource.setPassword(configuration.getPassword()); dataSource.setIdleConnectionTestPeriod(configuration.getIdleConnectionTestPeriod()); dataSource.setInitialPoolSize(configuration.getMinSize()); dataSource.setMaxPoolSize(configuration.getMaxSize()); } catch (Exception e) { logger.error("Failed while creating the data source", e); throw new MinnalException("Failed while configuring the data source", e); } return dataSource; } @Override public void close() { try { logger.info("Closing the datasource"); dataSource.close(); } catch (Exception e) { logger.error("Error while closing the datasource", e); } } @Override public DataSourceStatistics getStatistics() { return statistics; } /** * @return the configuration */ public DatabaseConfiguration getConfiguration() { return configuration; } /** * @param configuration the configuration to set */ public void setConfiguration(DatabaseConfiguration configuration) { this.configuration = configuration; } @JsonValue String getClassName() { return C3P0DataSourceProvider.class.getCanonicalName(); } }