Author: markt
Date: Thu Aug 5 22:27:53 2010
New Revision: 982811
URL: http://svn.apache.org/viewvc?rev=982811&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48817
Add Validator interface and allow users to configure a Validator class name
Added:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/Validator.java
(with props)
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java?rev=982811&r1=982810&r2=982811&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
Thu Aug 5 22:27:53 2010
@@ -81,6 +81,7 @@ public class DataSourceFactory implement
protected final static String PROP_TESTWHILEIDLE = "testWhileIdle";
protected final static String PROP_TESTONCONNECT = "testOnConnect";
protected final static String PROP_VALIDATIONQUERY = "validationQuery";
+ protected final static String PROP_VALIDATOR_CLASS_NAME =
"validatorClassName";
protected final static String PROP_TIMEBETWEENEVICTIONRUNSMILLIS =
"timeBetweenEvictionRunsMillis";
protected final static String PROP_NUMTESTSPEREVICTIONRUN =
"numTestsPerEvictionRun";
@@ -347,6 +348,11 @@ public class DataSourceFactory implement
if (value != null) {
poolProperties.setValidationQuery(value);
}
+
+ value = properties.getProperty(PROP_VALIDATOR_CLASS_NAME);
+ if (value != null) {
+ poolProperties.setValidatorClassName(value);
+ }
value = properties.getProperty(PROP_VALIDATIONINTERVAL);
if (value != null) {
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java?rev=982811&r1=982810&r2=982811&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
Thu Aug 5 22:27:53 2010
@@ -390,6 +390,14 @@ public class DataSourceProxy implements
this.poolProperties.setValidationQuery(validationQuery);
}
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public void setValidatorClassName(String className) {
+ this.poolProperties.setValidatorClassName(className);
+ }
+
/**
* {...@inheritdoc}
*/
@@ -818,6 +826,22 @@ public class DataSourceProxy implements
return getPoolProperties().getValidationQuery();
}
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public String getValidatorClassName() {
+ return getPoolProperties().getValidatorClassName();
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public Validator getValidator() {
+ return getPoolProperties().getValidator();
+ }
+
/**
* {...@inheritdoc}
*/
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java?rev=982811&r1=982810&r2=982811&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
Thu Aug 5 22:27:53 2010
@@ -522,9 +522,28 @@ public interface PoolConfiguration {
* @param validationQuery the query used for validation or null if no
validation is performed
*/
public void setValidationQuery(String validationQuery);
-
/**
+ * Return the name of the optional validator class - may be null.
+ *
+ * @return the name of the optional validator class - may be null
+ */
+ public String getValidatorClassName();
+
+ /**
+ * Set the name for an optional validator class which will be used in
place of test queries. If set to
+ * null, standard validation will be used.
+ *
+ * @param className the name of the optional validator class
+ */
+ public void setValidatorClassName(String className);
+
+ /**
+ * @return the optional validator object - may be null
+ */
+ public Validator getValidator();
+
+ /**
* avoid excess validation, only run validation at most at this frequency
- time in milliseconds.
* If a connection is due for validation, but has been validated
previously
* within this interval, it will not be validated again.
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java?rev=982811&r1=982810&r2=982811&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
Thu Aug 5 22:27:53 2010
@@ -51,6 +51,8 @@ public class PoolProperties implements P
protected int minIdle = initialSize;
protected int maxWait = 30000;
protected String validationQuery;
+ protected String validatorClassName;
+ protected Validator validator;
protected boolean testOnBorrow = false;
protected boolean testOnReturn = false;
protected boolean testWhileIdle = false;
@@ -338,6 +340,22 @@ public class PoolProperties implements P
return validationQuery;
}
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public String getValidatorClassName() {
+ return validatorClassName;
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public Validator getValidator() {
+ return validator;
+ }
+
/**
* {...@inheritdoc}
*/
@@ -631,6 +649,34 @@ public class PoolProperties implements P
this.validationQuery = validationQuery;
}
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public void setValidatorClassName(String className) {
+ this.validatorClassName = className;
+
+ validator = null;
+
+ if (className == null) {
+ return;
+ }
+
+ try {
+ Class<Validator> validatorClass =
(Class<Validator>)Class.forName(className);
+ validator = validatorClass.newInstance();
+ } catch (ClassNotFoundException e) {
+ log.warn("The class "+className+" cannot be found.", e);
+ } catch (ClassCastException e) {
+ log.warn("The class "+className+" does not implement the Validator
interface.", e);
+ } catch (InstantiationException e) {
+ log.warn("An object of class "+className+" cannot be instantiated.
Make sure that "+
+ "it includes an implicit or explicit no-arg
constructor.", e);
+ } catch (IllegalAccessException e) {
+ log.warn("The class "+className+" or its no-arg constructor are
inaccessible.", e);
+ }
+ }
+
/**
* {...@inheritdoc}
*/
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java?rev=982811&r1=982810&r2=982811&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
Thu Aug 5 22:27:53 2010
@@ -362,21 +362,29 @@ public class PooledConnection {
return true;
}
- String query = (VALIDATE_INIT==validateAction &&
(poolProperties.getInitSQL()!=null))?poolProperties.getInitSQL():sql;
-
- if (query==null) query = poolProperties.getValidationQuery();
-
- if (query == null) {
- //no validation possible
- return true;
- }
+ //Don't bother validating if already have recently enough
long now = System.currentTimeMillis();
- if (this.poolProperties.getValidationInterval() > 0 &&
- (validateAction!=VALIDATE_INIT) &&
+ if (validateAction!=VALIDATE_INIT &&
+ poolProperties.getValidationInterval() > 0 &&
(now - this.lastValidated) <
- this.poolProperties.getValidationInterval()) {
+ poolProperties.getValidationInterval()) {
return true;
}
+
+ if (poolProperties.getValidator() != null) {
+ return poolProperties.getValidator().validate(connection,
validateAction);
+ }
+
+ String query = sql;
+
+ if (validateAction == VALIDATE_INIT && poolProperties.getInitSQL() !=
null) {
+ query = poolProperties.getInitSQL();
+ }
+
+ if (query == null) {
+ query = poolProperties.getValidationQuery();
+ }
+
Statement stmt = null;
try {
stmt = connection.createStatement();
Added:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/Validator.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/Validator.java?rev=982811&view=auto
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/Validator.java
(added)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/Validator.java
Thu Aug 5 22:27:53 2010
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jdbc.pool;
+
+import java.sql.Connection;
+
+/**
+ * Interface to be implemented by custom validator classes.
+ *
+ * @author mpassell
+ */
+public interface Validator {
+ /**
+ * Validate a connection and return a boolean to indicate if it's valid.
+ *
+ * @param connection the Connection object to test
+ * @param validateAction the action used. One of {...@link
PooledConnection#VALIDATE_BORROW},
+ * {...@link PooledConnection#VALIDATE_IDLE}, {...@link
PooledConnection#VALIDATE_INIT} or
+ * {...@link PooledConnection#VALIDATE_RETURN}
+ * @return true if the connection is valid
+ */
+ public boolean validate(Connection connection, int validateAction);
+}
Propchange:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/Validator.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java?rev=982811&r1=982810&r2=982811&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
Thu Aug 5 22:27:53 2010
@@ -29,6 +29,7 @@ import javax.management.NotificationList
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.jdbc.pool.PoolConfiguration;
+import org.apache.tomcat.jdbc.pool.Validator;
import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorDefinition;
public class ConnectionPool extends NotificationBroadcasterSupport implements
ConnectionPoolMBean {
@@ -278,6 +279,22 @@ public class ConnectionPool extends Noti
return getPoolProperties().getValidationQuery();
}
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public String getValidatorClassName() {
+ return getPoolProperties().getValidatorClassName();
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public Validator getValidator() {
+ return getPoolProperties().getValidator();
+ }
+
public boolean isAccessToUnderlyingConnectionAllowed() {
return getPoolProperties().isAccessToUnderlyingConnectionAllowed();
}
@@ -557,48 +574,56 @@ public class ConnectionPool extends Noti
}
/**
- * {...@inheritdoc}
- */
- @Override
- public int getSuspectTimeout() {
- return getPoolProperties().getSuspectTimeout();
- }
-
- /**
- * {...@inheritdoc}
- */
- @Override
- public void setSuspectTimeout(int seconds) {
- //no op
- }
-
- /**
- * {...@inheritdoc}
- */
- public void setDataSource(Object ds) {
- getPoolProperties().setDataSource(ds);
- }
-
- /**
- * {...@inheritdoc}
- */
- public Object getDataSource() {
- return getPoolProperties().getDataSource();
- }
-
-
- /**
- * {...@inheritdoc}
- */
- public void setDataSourceJNDI(String jndiDS) {
- //noop
- }
-
- /**
- * {...@inheritdoc}
- */
- public String getDataSourceJNDI() {
- return getPoolProperties().getDataSourceJNDI();
- }
+ * {...@inheritdoc}
+ */
+ @Override
+ public void setValidatorClassName(String className) {
+ getPoolProperties().setValidatorClassName(className);
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public int getSuspectTimeout() {
+ return getPoolProperties().getSuspectTimeout();
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ @Override
+ public void setSuspectTimeout(int seconds) {
+ //no op
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ public void setDataSource(Object ds) {
+ getPoolProperties().setDataSource(ds);
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ public Object getDataSource() {
+ return getPoolProperties().getDataSource();
+ }
+
+
+ /**
+ * {...@inheritdoc}
+ */
+ public void setDataSourceJNDI(String jndiDS) {
+ //noop
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ public String getDataSourceJNDI() {
+ return getPoolProperties().getDataSourceJNDI();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]