package org.springframework.cloud.service.relational; import java.util.logging.Logger; import javax.sql.DataSource; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig; import org.springframework.cloud.service.ServiceConnectorConfig; import org.springframework.cloud.service.common.RelationalServiceInfo; /** * Common implementation that assumes DBCP connection pool properties. * * @author Ramnivas Laddad * * @param <SI> the {@link RelationalServiceInfo} type for the underlying database service */ public abstract class DbcpLikePooledDataSourceCreator<SI extends RelationalServiceInfo> implements PooledDataSourceCreator<SI> { protected static Logger logger = Logger.getLogger(PooledDataSourceCreator.class.getName()); private DataSourceConfigurer configurer = new DataSourceConfigurer(); protected void setBasicDataSourceProperties(DataSource basicDataSource, RelationalServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfig, String driverClassName, String validationQuery) { BeanWrapper target = new BeanWrapperImpl(basicDataSource); target.setPropertyValue("driverClassName", driverClassName); target.setPropertyValue("url", serviceInfo.getJdbcUrl()); if (validationQuery != null) { target.setPropertyValue("validationQuery", validationQuery); target.setPropertyValue("testOnBorrow", true); } if (serviceConnectorConfig == null) { // choose sensible values so that we set max connection pool size to what // free tier services on Cloud Foundry and Heroku allow serviceConnectorConfig = new DataSourceConfig(new PoolConfig(4, 30000), null); } configurer.configure(basicDataSource, (DataSourceConfig)serviceConnectorConfig); } }