Support tomcat 7 and tomcat 8 datasource connection pooling.

This commit is contained in:
Scott Frederick
2015-07-23 20:04:05 -05:00
parent 3e64c952d8
commit e3eae31995
3 changed files with 43 additions and 9 deletions

View File

@@ -190,7 +190,9 @@ ext {
"amqp12" : [springAmqpVersion: "1.2.2.RELEASE"],
"amqp13" : [springAmqpVersion: "1.3.6.RELEASE"],
"spring32" : [springVersion: "3.2.9.RELEASE"],
"spring40" : [springVersion: "4.0.5.RELEASE"]
"spring40" : [springVersion: "4.0.5.RELEASE"],
"tomcat7" : [tomcatVersion: "7.0.53"],
"tomcat8" : [tomcatVersion: "8.0.24"],
]
}

View File

@@ -5,6 +5,7 @@ import static org.springframework.cloud.service.Util.hasClass;
import javax.sql.DataSource;
import org.springframework.cloud.service.ServiceConnectorConfig;
import org.springframework.cloud.service.ServiceConnectorCreationException;
import org.springframework.cloud.service.common.RelationalServiceInfo;
/**
@@ -15,17 +16,32 @@ import org.springframework.cloud.service.common.RelationalServiceInfo;
*/
public class TomcatDbcpPooledDataSourceCreator<SI extends RelationalServiceInfo> extends DbcpLikePooledDataSourceCreator<SI> {
public static final String TOMCAT_7_DBCP = "org.apache.tomcat.dbcp.dbcp.BasicDataSource";
public static final String TOMCAT_8_DBCP = "org.apache.tomcat.dbcp.dbcp2.BasicDataSource";
@Override
public DataSource create(RelationalServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfig,
String driverClassName, String validationQuery) {
if (hasClass("org.apache.tomcat.dbcp.dbcp.BasicDataSource")) {
logger.info("Found Tomcat dbcp connection pool on the classpath. Using it for DataSource connection pooling.");
org.apache.tomcat.dbcp.dbcp.BasicDataSource ds = new org.apache.tomcat.dbcp.dbcp.BasicDataSource();
setBasicDataSourceProperties(ds, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery);
return ds;
if (hasClass(TOMCAT_7_DBCP)) {
logger.info("Found Tomcat 7 dbcp connection pool on the classpath. Using it for DataSource connection pooling.");
return createDataSource(TOMCAT_7_DBCP, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery);
} else if (hasClass(TOMCAT_8_DBCP)) {
logger.info("Found Tomcat 8 dbcp connection pool on the classpath. Using it for DataSource connection pooling.");
return createDataSource(TOMCAT_8_DBCP, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery);
} else {
return null;
}
}
private DataSource createDataSource(String className, RelationalServiceInfo serviceInfo,
ServiceConnectorConfig serviceConnectorConfig,
String driverClassName, String validationQuery) {
try {
DataSource dataSource = (DataSource) Class.forName(className).newInstance();
setBasicDataSourceProperties(dataSource, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery);
return dataSource;
} catch (Throwable e) {
throw new ServiceConnectorCreationException("Error instantiating Tomcat dbcp connection pool", e);
}
}
}

View File

@@ -9,6 +9,13 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.cloud.service.common.MysqlServiceInfo;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.springframework.cloud.service.Util.hasClass;
import static org.springframework.cloud.service.relational.TomcatDbcpPooledDataSourceCreator.TOMCAT_7_DBCP;
import static org.springframework.cloud.service.relational.TomcatDbcpPooledDataSourceCreator.TOMCAT_8_DBCP;
public class PooledDataSourceCreatorsTest {
@Mock private MysqlServiceInfo mockMysqlServiceInfo;
@@ -26,8 +33,16 @@ public class PooledDataSourceCreatorsTest {
}
@Test
public void pooledDataSourceCreationTomcatDbcp() {
assertPooledDataSource(new TomcatDbcpPooledDataSourceCreator<MysqlServiceInfo>());
public void pooledDataSourceCreationTomcatDbcp() throws Exception {
DataSource ds = assertPooledDataSource(new TomcatDbcpPooledDataSourceCreator<MysqlServiceInfo>());
assertTrue(hasClass(TOMCAT_7_DBCP) || hasClass(TOMCAT_8_DBCP));
if (hasClass(TOMCAT_7_DBCP)) {
assertThat(ds, instanceOf(Class.forName(TOMCAT_7_DBCP)));
}
if (hasClass(TOMCAT_8_DBCP)) {
assertThat(ds, instanceOf(Class.forName(TOMCAT_8_DBCP)));
}
}
@Test
@@ -40,12 +55,13 @@ public class PooledDataSourceCreatorsTest {
assertPooledDataSource(new HikariCpPooledDataSourceCreator<MysqlServiceInfo>());
}
private void assertPooledDataSource(PooledDataSourceCreator<MysqlServiceInfo> testCreator) {
private DataSource assertPooledDataSource(PooledDataSourceCreator<MysqlServiceInfo> testCreator) {
DataSource ds = testCreator.create(mockMysqlServiceInfo, null,
mysqlDataSourceCreator.getDriverClassName(mockMysqlServiceInfo),
"select 1");
Assert.assertNotNull("Failed to create datasource with " + testCreator.getClass().getSimpleName(), ds);
return ds;
}
}