Commit 1b167f63 authored by Piotr Maj's avatar Piotr Maj Committed by Dave Syer

Support for maxWait, jdbcInterceptors and validationInterval

Fixes gh-470
parent 4d172ca7
...@@ -61,6 +61,8 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader ...@@ -61,6 +61,8 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader
private int minEvictableIdleTimeMillis = getDefaultMinEvictableIdleTimeMillis(); private int minEvictableIdleTimeMillis = getDefaultMinEvictableIdleTimeMillis();
private int maxWaitMillis = getDefaultMaxWaitMillis();
private ClassLoader classLoader; private ClassLoader classLoader;
private EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection.NONE; private EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection.NONE;
...@@ -182,6 +184,8 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader ...@@ -182,6 +184,8 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
} }
public void setMaxWait(int maxWaitMillis) { this.maxWaitMillis = maxWaitMillis; }
public int getInitialSize() { public int getInitialSize() {
return this.initialSize; return this.initialSize;
} }
...@@ -218,8 +222,11 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader ...@@ -218,8 +222,11 @@ public abstract class AbstractDataSourceConfiguration implements BeanClassLoader
protected int getMinEvictableIdleTimeMillis() { return this.minEvictableIdleTimeMillis; } protected int getMinEvictableIdleTimeMillis() { return this.minEvictableIdleTimeMillis; }
protected int getMaxWaitMillis() { return this.maxWaitMillis; }
protected abstract int getDefaultTimeBetweenEvictionRunsMillis(); protected abstract int getDefaultTimeBetweenEvictionRunsMillis();
protected abstract int getDefaultMinEvictableIdleTimeMillis(); protected abstract int getDefaultMinEvictableIdleTimeMillis();
protected abstract int getDefaultMaxWaitMillis();
} }
...@@ -71,7 +71,7 @@ public class CommonsDataSourceConfiguration extends AbstractDataSourceConfigurat ...@@ -71,7 +71,7 @@ public class CommonsDataSourceConfiguration extends AbstractDataSourceConfigurat
this.pool.setTimeBetweenEvictionRunsMillis(getTimeBetweenEvictionRunsMillis()); this.pool.setTimeBetweenEvictionRunsMillis(getTimeBetweenEvictionRunsMillis());
this.pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis()); this.pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis());
this.pool.setValidationQuery(getValidationQuery()); this.pool.setValidationQuery(getValidationQuery());
this.pool.setMaxWait(getMaxWaitMillis());
return this.pool; return this.pool;
} }
...@@ -96,4 +96,9 @@ public class CommonsDataSourceConfiguration extends AbstractDataSourceConfigurat ...@@ -96,4 +96,9 @@ public class CommonsDataSourceConfiguration extends AbstractDataSourceConfigurat
protected int getDefaultMinEvictableIdleTimeMillis() { protected int getDefaultMinEvictableIdleTimeMillis() {
return (int) GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; return (int) GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
} }
@Override
protected int getDefaultMaxWaitMillis() {
return (int) GenericObjectPool.DEFAULT_MAX_WAIT;
}
} }
...@@ -32,6 +32,8 @@ import org.springframework.context.annotation.Configuration; ...@@ -32,6 +32,8 @@ import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
public class TomcatDataSourceConfiguration extends AbstractDataSourceConfiguration { public class TomcatDataSourceConfiguration extends AbstractDataSourceConfiguration {
private String jdbcInterceptors;
private long validationInterval = 30000;
private org.apache.tomcat.jdbc.pool.DataSource pool; private org.apache.tomcat.jdbc.pool.DataSource pool;
@Bean(destroyMethod = "close") @Bean(destroyMethod = "close")
...@@ -55,6 +57,11 @@ public class TomcatDataSourceConfiguration extends AbstractDataSourceConfigurati ...@@ -55,6 +57,11 @@ public class TomcatDataSourceConfiguration extends AbstractDataSourceConfigurati
this.pool.setTimeBetweenEvictionRunsMillis(getTimeBetweenEvictionRunsMillis()); this.pool.setTimeBetweenEvictionRunsMillis(getTimeBetweenEvictionRunsMillis());
this.pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis()); this.pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis());
this.pool.setValidationQuery(getValidationQuery()); this.pool.setValidationQuery(getValidationQuery());
this.pool.setValidationInterval(this.validationInterval);
this.pool.setMaxWait(getMaxWaitMillis());
if (jdbcInterceptors != null) {
this.pool.setJdbcInterceptors(this.jdbcInterceptors);
}
return this.pool; return this.pool;
} }
...@@ -74,4 +81,13 @@ public class TomcatDataSourceConfiguration extends AbstractDataSourceConfigurati ...@@ -74,4 +81,13 @@ public class TomcatDataSourceConfiguration extends AbstractDataSourceConfigurati
protected int getDefaultMinEvictableIdleTimeMillis() { protected int getDefaultMinEvictableIdleTimeMillis() {
return 60000; return 60000;
} }
@Override
protected int getDefaultMaxWaitMillis() {
return 30000;
}
public void setJdbcInterceptors(String jdbcInterceptors) { this.jdbcInterceptors = jdbcInterceptors; }
public void setValidationInterval(long validationInterval) { this.validationInterval = validationInterval; }
} }
...@@ -53,6 +53,7 @@ public class CommonsDataSourceConfigurationTests { ...@@ -53,6 +53,7 @@ public class CommonsDataSourceConfigurationTests {
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.testOnReturn:true"); EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.testOnReturn:true");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.timeBetweenEvictionRunsMillis:10000"); EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.timeBetweenEvictionRunsMillis:10000");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.minEvictableIdleTimeMillis:12345"); EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.minEvictableIdleTimeMillis:12345");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.maxWait:1234");
this.context.refresh(); this.context.refresh();
BasicDataSource ds = this.context.getBean(BasicDataSource.class); BasicDataSource ds = this.context.getBean(BasicDataSource.class);
assertEquals("jdbc:foo//bar/spam", ds.getUrl()); assertEquals("jdbc:foo//bar/spam", ds.getUrl());
...@@ -61,6 +62,7 @@ public class CommonsDataSourceConfigurationTests { ...@@ -61,6 +62,7 @@ public class CommonsDataSourceConfigurationTests {
assertEquals(true, ds.getTestOnReturn()); assertEquals(true, ds.getTestOnReturn());
assertEquals(10000, ds.getTimeBetweenEvictionRunsMillis()); assertEquals(10000, ds.getTimeBetweenEvictionRunsMillis());
assertEquals(12345, ds.getMinEvictableIdleTimeMillis()); assertEquals(12345, ds.getMinEvictableIdleTimeMillis());
assertEquals(1234, ds.getMaxWait());
} }
@Test @Test
...@@ -70,6 +72,7 @@ public class CommonsDataSourceConfigurationTests { ...@@ -70,6 +72,7 @@ public class CommonsDataSourceConfigurationTests {
BasicDataSource ds = this.context.getBean(BasicDataSource.class); BasicDataSource ds = this.context.getBean(BasicDataSource.class);
assertEquals(GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, ds.getTimeBetweenEvictionRunsMillis()); assertEquals(GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, ds.getTimeBetweenEvictionRunsMillis());
assertEquals(GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, ds.getMinEvictableIdleTimeMillis()); assertEquals(GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, ds.getMinEvictableIdleTimeMillis());
assertEquals(GenericObjectPool.DEFAULT_MAX_WAIT, ds.getMaxWait());
} }
} }
...@@ -20,6 +20,9 @@ import java.lang.reflect.Field; ...@@ -20,6 +20,9 @@ import java.lang.reflect.Field;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.apache.tomcat.jdbc.pool.DataSourceProxy;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCreationException;
...@@ -30,6 +33,7 @@ import org.springframework.util.ReflectionUtils; ...@@ -30,6 +33,7 @@ import org.springframework.util.ReflectionUtils;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
/** /**
* Tests for {@link TomcatDataSourceConfiguration}. * Tests for {@link TomcatDataSourceConfiguration}.
...@@ -62,6 +66,9 @@ public class TomcatDataSourceConfigurationTests { ...@@ -62,6 +66,9 @@ public class TomcatDataSourceConfigurationTests {
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.testOnReturn:true"); EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.testOnReturn:true");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.timeBetweenEvictionRunsMillis:10000"); EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.timeBetweenEvictionRunsMillis:10000");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.minEvictableIdleTimeMillis:12345"); EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.minEvictableIdleTimeMillis:12345");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.maxWait:1234");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.jdbcInterceptors:SlowQueryReport");
EnvironmentTestUtils.addEnvironment(this.context, "spring.datasource.validationInterval:9999");
this.context.refresh(); this.context.refresh();
org.apache.tomcat.jdbc.pool.DataSource ds = this.context.getBean(org.apache.tomcat.jdbc.pool.DataSource.class); org.apache.tomcat.jdbc.pool.DataSource ds = this.context.getBean(org.apache.tomcat.jdbc.pool.DataSource.class);
assertEquals("jdbc:foo//bar/spam", ds.getUrl()); assertEquals("jdbc:foo//bar/spam", ds.getUrl());
...@@ -70,6 +77,19 @@ public class TomcatDataSourceConfigurationTests { ...@@ -70,6 +77,19 @@ public class TomcatDataSourceConfigurationTests {
assertEquals(true, ds.isTestOnReturn()); assertEquals(true, ds.isTestOnReturn());
assertEquals(10000, ds.getTimeBetweenEvictionRunsMillis()); assertEquals(10000, ds.getTimeBetweenEvictionRunsMillis());
assertEquals(12345, ds.getMinEvictableIdleTimeMillis()); assertEquals(12345, ds.getMinEvictableIdleTimeMillis());
assertEquals(1234, ds.getMaxWait());
assertEquals(9999L, ds.getValidationInterval());
assertDataSourceHasInterceptors(ds);
}
private void assertDataSourceHasInterceptors(DataSourceProxy ds) throws ClassNotFoundException {
PoolProperties.InterceptorDefinition[] interceptors = ds.getJdbcInterceptorsAsArray();
for (PoolProperties.InterceptorDefinition interceptor : interceptors) {
if (SlowQueryReport.class == interceptor.getInterceptorClass()) {
return;
}
}
fail("SlowQueryReport interceptor should have been set.");
} }
@Test @Test
...@@ -79,6 +99,8 @@ public class TomcatDataSourceConfigurationTests { ...@@ -79,6 +99,8 @@ public class TomcatDataSourceConfigurationTests {
org.apache.tomcat.jdbc.pool.DataSource ds = this.context.getBean(org.apache.tomcat.jdbc.pool.DataSource.class); org.apache.tomcat.jdbc.pool.DataSource ds = this.context.getBean(org.apache.tomcat.jdbc.pool.DataSource.class);
assertEquals(5000, ds.getTimeBetweenEvictionRunsMillis()); assertEquals(5000, ds.getTimeBetweenEvictionRunsMillis());
assertEquals(60000, ds.getMinEvictableIdleTimeMillis()); assertEquals(60000, ds.getMinEvictableIdleTimeMillis());
assertEquals(30000, ds.getMaxWait());
assertEquals(30000L, ds.getValidationInterval());
} }
@Test(expected = BeanCreationException.class) @Test(expected = BeanCreationException.class)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment