Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java?rev=1833804&r1=1833803&r2=1833804&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java Tue Jun 19 10:30:31 2018 @@ -40,67 +40,86 @@ import org.apache.tomcat.dbcp.pool2.impl * A {@link PooledObjectFactory} that creates * {@link org.apache.tomcat.dbcp.dbcp2.PoolableConnection PoolableConnection}s. * - * @author John D. McNally * @since 2.0 */ class CPDSConnectionFactory - implements PooledObjectFactory<PooledConnectionAndInfo>, - ConnectionEventListener, PooledConnectionManager { + implements PooledObjectFactory<PooledConnectionAndInfo>, ConnectionEventListener, PooledConnectionManager { - private static final String NO_KEY_MESSAGE - = "close() was called on a Connection, but " - + "I have no record of the underlying PooledConnection."; - - private final ConnectionPoolDataSource _cpds; - private final String _validationQuery; - private final int _validationQueryTimeout; - private final boolean _rollbackAfterValidation; - private ObjectPool<PooledConnectionAndInfo> _pool; - private final String _username; - private String _password = null; - private long maxConnLifetimeMillis = -1; + private static final String NO_KEY_MESSAGE = "close() was called on a Connection, but I have no record of the underlying PooledConnection."; + private final ConnectionPoolDataSource cpds; + private final String validationQuery; + private final int validationQueryTimeoutSeconds; + private final boolean rollbackAfterValidation; + private ObjectPool<PooledConnectionAndInfo> pool; + private final String userName; + private char[] userPassword; + private long maxConnLifetimeMillis = -1; /** - * Map of PooledConnections for which close events are ignored. - * Connections are muted when they are being validated. + * Map of PooledConnections for which close events are ignored. Connections are muted when they are being validated. */ - private final Set<PooledConnection> validatingSet = - Collections.newSetFromMap(new ConcurrentHashMap<PooledConnection,Boolean>()); + private final Set<PooledConnection> validatingSet = Collections + .newSetFromMap(new ConcurrentHashMap<PooledConnection, Boolean>()); /** * Map of PooledConnectionAndInfo instances */ - private final Map<PooledConnection, PooledConnectionAndInfo> pcMap = - new ConcurrentHashMap<>(); + private final Map<PooledConnection, PooledConnectionAndInfo> pcMap = new ConcurrentHashMap<>(); /** - * Create a new {@code PoolableConnectionFactory}. + * Creates a new {@code PoolableConnectionFactory}. * - * @param cpds the ConnectionPoolDataSource from which to obtain - * PooledConnection's - * @param validationQuery a query to use to {@link #validateObject - * validate} {@link Connection}s. Should return at least one row. - * May be {@code null} in which case {@link Connection#isValid(int)} will - * be used to validate connections. - * @param validationQueryTimeout Timeout in seconds before validation fails - * @param rollbackAfterValidation whether a rollback should be issued - * after {@link #validateObject validating} {@link Connection}s. - * @param username The user name to use to create connections - * @param password The password to use to create connections - */ - public CPDSConnectionFactory(final ConnectionPoolDataSource cpds, - final String validationQuery, - final int validationQueryTimeout, - final boolean rollbackAfterValidation, - final String username, - final String password) { - _cpds = cpds; - _validationQuery = validationQuery; - _validationQueryTimeout = validationQueryTimeout; - _username = username; - _password = password; - _rollbackAfterValidation = rollbackAfterValidation; + * @param cpds + * the ConnectionPoolDataSource from which to obtain PooledConnection's + * @param validationQuery + * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one + * row. May be {@code null} in which case {@link Connection#isValid(int)} will be used to validate + * connections. + * @param validationQueryTimeoutSeconds + * Timeout in seconds before validation fails + * @param rollbackAfterValidation + * whether a rollback should be issued after {@link #validateObject validating} {@link Connection}s. + * @param userName + * The user name to use to create connections + * @param userPassword + * The password to use to create connections + * @since 2.4.0 + */ + public CPDSConnectionFactory(final ConnectionPoolDataSource cpds, final String validationQuery, + final int validationQueryTimeoutSeconds, final boolean rollbackAfterValidation, final String userName, + final char[] userPassword) { + this.cpds = cpds; + this.validationQuery = validationQuery; + this.validationQueryTimeoutSeconds = validationQueryTimeoutSeconds; + this.userName = userName; + this.userPassword = userPassword; + this.rollbackAfterValidation = rollbackAfterValidation; + } + + /** + * Creates a new {@code PoolableConnectionFactory}. + * + * @param cpds + * the ConnectionPoolDataSource from which to obtain PooledConnection's + * @param validationQuery + * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one + * row. May be {@code null} in which case {@link Connection#isValid(int)} will be used to validate + * connections. + * @param validationQueryTimeoutSeconds + * Timeout in seconds before validation fails + * @param rollbackAfterValidation + * whether a rollback should be issued after {@link #validateObject validating} {@link Connection}s. + * @param userName + * The user name to use to create connections + * @param userPassword + * The password to use to create connections + */ + public CPDSConnectionFactory(final ConnectionPoolDataSource cpds, final String validationQuery, + final int validationQueryTimeoutSeconds, final boolean rollbackAfterValidation, final String userName, + final String userPassword) { + this(cpds, validationQuery, validationQueryTimeoutSeconds, rollbackAfterValidation, userName, + Utils.toCharArray(userPassword)); } /** @@ -109,16 +128,16 @@ class CPDSConnectionFactory * @return ObjectPool managing pooled connections */ public ObjectPool<PooledConnectionAndInfo> getPool() { - return _pool; + return pool; } /** * - * @param pool the {@link ObjectPool} in which to pool those {@link - * Connection}s + * @param pool + * the {@link ObjectPool} in which to pool those {@link Connection}s */ public void setPool(final ObjectPool<PooledConnectionAndInfo> pool) { - this._pool = pool; + this.pool = pool; } @Override @@ -126,10 +145,10 @@ class CPDSConnectionFactory PooledConnectionAndInfo pci; try { PooledConnection pc = null; - if (_username == null) { - pc = _cpds.getPooledConnection(); + if (userName == null) { + pc = cpds.getPooledConnection(); } else { - pc = _cpds.getPooledConnection(_username, _password); + pc = cpds.getPooledConnection(userName, Utils.toString(userPassword)); } if (pc == null) { @@ -139,7 +158,7 @@ class CPDSConnectionFactory // should we add this object as a listener or the pool. // consider the validateObject method in decision pc.addConnectionEventListener(this); - pci = new PooledConnectionAndInfo(pc, _username, _password); + pci = new PooledConnectionAndInfo(pc, userName, userPassword); pcMap.put(pc, pci); } catch (final SQLException e) { throw new RuntimeException(e.getMessage()); @@ -155,7 +174,7 @@ class CPDSConnectionFactory doDestroyObject(p.getObject()); } - private void doDestroyObject(final PooledConnectionAndInfo pci) throws Exception{ + private void doDestroyObject(final PooledConnectionAndInfo pci) throws Exception { final PooledConnection pc = pci.getPooledConnection(); pc.removeConnectionEventListener(this); pcMap.remove(pc); @@ -173,14 +192,14 @@ class CPDSConnectionFactory final PooledConnection pconn = p.getObject().getPooledConnection(); Connection conn = null; validatingSet.add(pconn); - if (null == _validationQuery) { - int timeout = _validationQueryTimeout; - if (timeout < 0) { - timeout = 0; + if (null == validationQuery) { + int timeoutSeconds = validationQueryTimeoutSeconds; + if (timeoutSeconds < 0) { + timeoutSeconds = 0; } try { conn = pconn.getConnection(); - valid = conn.isValid(timeout); + valid = conn.isValid(timeoutSeconds); } catch (final SQLException e) { valid = false; } finally { @@ -198,13 +217,13 @@ class CPDSConnectionFactory try { conn = pconn.getConnection(); stmt = conn.createStatement(); - rset = stmt.executeQuery(_validationQuery); + rset = stmt.executeQuery(validationQuery); if (rset.next()) { valid = true; } else { valid = false; } - if (_rollbackAfterValidation) { + if (rollbackAfterValidation) { conn.rollback(); } } catch (final Exception e) { @@ -220,14 +239,12 @@ class CPDSConnectionFactory } @Override - public void passivateObject(final PooledObject<PooledConnectionAndInfo> p) - throws Exception { + public void passivateObject(final PooledObject<PooledConnectionAndInfo> p) throws Exception { validateLifetime(p); } @Override - public void activateObject(final PooledObject<PooledConnectionAndInfo> p) - throws Exception { + public void activateObject(final PooledObject<PooledConnectionAndInfo> p) throws Exception { validateLifetime(p); } @@ -236,10 +253,9 @@ class CPDSConnectionFactory // *********************************************************************** /** - * This will be called if the Connection returned by the getConnection - * method came from a PooledConnection, and the user calls the close() - * method of this connection object. What we need to do here is to - * release this PooledConnection from our pool... + * This will be called if the Connection returned by the getConnection method came from a PooledConnection, and the + * user calls the close() method of this connection object. What we need to do here is to release this + * PooledConnection from our pool... */ @Override public void connectionClosed(final ConnectionEvent event) { @@ -253,16 +269,14 @@ class CPDSConnectionFactory } try { - _pool.returnObject(pci); + pool.returnObject(pci); } catch (final Exception e) { - System.err.println("CLOSING DOWN CONNECTION AS IT COULD " - + "NOT BE RETURNED TO THE POOL"); + System.err.println("CLOSING DOWN CONNECTION AS IT COULD " + "NOT BE RETURNED TO THE POOL"); pc.removeConnectionEventListener(this); try { doDestroyObject(pci); } catch (final Exception e2) { - System.err.println("EXCEPTION WHILE DESTROYING OBJECT " - + pci); + System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + pci); e2.printStackTrace(); } } @@ -270,16 +284,13 @@ class CPDSConnectionFactory } /** - * If a fatal error occurs, close the underlying physical connection so as - * not to be returned in the future + * If a fatal error occurs, close the underlying physical connection so as not to be returned in the future */ @Override public void connectionErrorOccurred(final ConnectionEvent event) { - final PooledConnection pc = (PooledConnection)event.getSource(); + final PooledConnection pc = (PooledConnection) event.getSource(); if (null != event.getSQLException()) { - System.err.println( - "CLOSING DOWN CONNECTION DUE TO INTERNAL ERROR (" - + event.getSQLException() + ")"); + System.err.println("CLOSING DOWN CONNECTION DUE TO INTERNAL ERROR (" + event.getSQLException() + ")"); } pc.removeConnectionEventListener(this); @@ -288,7 +299,7 @@ class CPDSConnectionFactory throw new IllegalStateException(NO_KEY_MESSAGE); } try { - _pool.invalidateObject(pci); + pool.invalidateObject(pci); } catch (final Exception e) { System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + pci); e.printStackTrace(); @@ -300,10 +311,9 @@ class CPDSConnectionFactory // *********************************************************************** /** - * Invalidates the PooledConnection in the pool. The CPDSConnectionFactory - * closes the connection and pool counters are updated appropriately. - * Also closes the pool. This ensures that all idle connections are closed - * and connections that are checked out are closed on return. + * Invalidates the PooledConnection in the pool. The CPDSConnectionFactory closes the connection and pool counters + * are updated appropriately. Also closes the pool. This ensures that all idle connections are closed and + * connections that are checked out are closed on return. */ @Override public void invalidate(final PooledConnection pc) throws SQLException { @@ -312,8 +322,8 @@ class CPDSConnectionFactory throw new IllegalStateException(NO_KEY_MESSAGE); } try { - _pool.invalidateObject(pci); // Destroy instance and update pool counters - _pool.close(); // Clear any other instances in this pool and kill others as they come back + pool.invalidateObject(pci); // Destroy instance and update pool counters + pool.close(); // Clear any other instances in this pool and kill others as they come back } catch (final Exception ex) { throw new SQLException("Error invalidating connection", ex); } @@ -322,50 +332,58 @@ class CPDSConnectionFactory /** * Sets the database password used when creating new connections. * - * @param password new password + * @param userPassword + * new password + */ + public synchronized void setPassword(final char[] userPassword) { + this.userPassword = userPassword; + } + + /** + * Sets the database password used when creating new connections. + * + * @param userPassword + * new password */ @Override - public synchronized void setPassword(final String password) { - _password = password; + public synchronized void setPassword(final String userPassword) { + this.userPassword = Utils.toCharArray(userPassword); } /** - * Sets the maximum lifetime in milliseconds of a connection after which the - * connection will always fail activation, passivation and validation. + * Sets the maximum lifetime in milliseconds of a connection after which the connection will always fail activation, + * passivation and validation. * - * @param maxConnLifetimeMillis A value of zero or less indicates an - * infinite lifetime. The default value is -1. + * @param maxConnLifetimeMillis + * A value of zero or less indicates an infinite lifetime. The default value is -1. */ public void setMaxConnLifetimeMillis(final long maxConnLifetimeMillis) { this.maxConnLifetimeMillis = maxConnLifetimeMillis; } /** - * Verifies that the username matches the user whose connections are being managed by this - * factory and closes the pool if this is the case; otherwise does nothing. + * Verifies that the user name matches the user whose connections are being managed by this factory and closes the + * pool if this is the case; otherwise does nothing. */ @Override - public void closePool(final String username) throws SQLException { + public void closePool(final String userName) throws SQLException { synchronized (this) { - if (username == null || !username.equals(_username)) { + if (userName == null || !userName.equals(this.userName)) { return; } } try { - _pool.close(); + pool.close(); } catch (final Exception ex) { throw new SQLException("Error closing connection pool", ex); } } - private void validateLifetime(final PooledObject<PooledConnectionAndInfo> p) - throws Exception { + private void validateLifetime(final PooledObject<PooledConnectionAndInfo> p) throws Exception { if (maxConnLifetimeMillis > 0) { final long lifetime = System.currentTimeMillis() - p.getCreateTime(); if (lifetime > maxConnLifetimeMillis) { - throw new Exception(Utils.getMessage( - "connectionFactory.lifetimeExceeded", - Long.valueOf(lifetime), + throw new Exception(Utils.getMessage("connectionFactory.lifetimeExceeded", Long.valueOf(lifetime), Long.valueOf(maxConnLifetimeMillis))); } }
Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java?rev=1833804&r1=1833803&r2=1833804&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java Tue Jun 19 10:30:31 2018 @@ -39,132 +39,104 @@ import org.apache.tomcat.dbcp.pool2.impl import org.apache.tomcat.dbcp.pool2.impl.GenericKeyedObjectPoolConfig; /** - * <p>The base class for <code>SharedPoolDataSource</code> and - * <code>PerUserPoolDataSource</code>. Many of the configuration properties - * are shared and defined here. This class is declared public in order - * to allow particular usage with commons-beanutils; do not make direct - * use of it outside of <em>commons-dbcp2</em>. + * <p> + * The base class for <code>SharedPoolDataSource</code> and <code>PerUserPoolDataSource</code>. Many of the + * configuration properties are shared and defined here. This class is declared public in order to allow particular + * usage with commons-beanutils; do not make direct use of it outside of <em>commons-dbcp2</em>. * </p> * * <p> - * A J2EE container will normally provide some method of initializing the - * <code>DataSource</code> whose attributes are presented - * as bean getters/setters and then deploying it via JNDI. It is then - * available to an application as a source of pooled logical connections to - * the database. The pool needs a source of physical connections. This - * source is in the form of a <code>ConnectionPoolDataSource</code> that - * can be specified via the {@link #setDataSourceName(String)} used to - * lookup the source via JNDI. + * A J2EE container will normally provide some method of initializing the <code>DataSource</code> whose attributes are + * presented as bean getters/setters and then deploying it via JNDI. It is then available to an application as a source + * of pooled logical connections to the database. The pool needs a source of physical connections. This source is in the + * form of a <code>ConnectionPoolDataSource</code> that can be specified via the {@link #setDataSourceName(String)} used + * to lookup the source via JNDI. * </p> * * <p> - * Although normally used within a JNDI environment, A DataSource - * can be instantiated and initialized as any bean. In this case the - * <code>ConnectionPoolDataSource</code> will likely be instantiated in - * a similar manner. This class allows the physical source of connections - * to be attached directly to this pool using the + * Although normally used within a JNDI environment, A DataSource can be instantiated and initialized as any bean. In + * this case the <code>ConnectionPoolDataSource</code> will likely be instantiated in a similar manner. This class + * allows the physical source of connections to be attached directly to this pool using the * {@link #setConnectionPoolDataSource(ConnectionPoolDataSource)} method. * </p> * * <p> - * The dbcp package contains an adapter, - * {@link org.apache.tomcat.dbcp.dbcp2.cpdsadapter.DriverAdapterCPDS}, - * that can be used to allow the use of <code>DataSource</code>'s based on this - * class with JDBC driver implementations that do not supply a - * <code>ConnectionPoolDataSource</code>, but still - * provide a {@link java.sql.Driver} implementation. + * The dbcp package contains an adapter, {@link org.apache.tomcat.dbcp.dbcp2.cpdsadapter.DriverAdapterCPDS}, that can be + * used to allow the use of <code>DataSource</code>'s based on this class with JDBC driver implementations that do not + * supply a <code>ConnectionPoolDataSource</code>, but still provide a {@link java.sql.Driver} implementation. * </p> * * <p> - * The <a href="package-summary.html">package documentation</a> contains an - * example using Apache Tomcat and JNDI and it also contains a non-JNDI example. + * The <a href="package-summary.html">package documentation</a> contains an example using Apache Tomcat and JNDI and it + * also contains a non-JNDI example. * </p> * - * @author John D. McNally * @since 2.0 */ -public abstract class InstanceKeyDataSource - implements DataSource, Referenceable, Serializable, AutoCloseable { +public abstract class InstanceKeyDataSource implements DataSource, Referenceable, Serializable, AutoCloseable { private static final long serialVersionUID = -6819270431752240878L; - private static final String GET_CONNECTION_CALLED - = "A Connection was already requested from this source, " + private static final String GET_CONNECTION_CALLED = "A Connection was already requested from this source, " + "further initialization is not allowed."; - private static final String BAD_TRANSACTION_ISOLATION - = "The requested TransactionIsolation level is invalid."; + private static final String BAD_TRANSACTION_ISOLATION = "The requested TransactionIsolation level is invalid."; /** - * Internal constant to indicate the level is not set. - */ + * Internal constant to indicate the level is not set. + */ protected static final int UNKNOWN_TRANSACTIONISOLATION = -1; /** Guards property setters - once true, setters throw IllegalStateException */ - private volatile boolean getConnectionCalled = false; + private volatile boolean getConnectionCalled; /** Underlying source of PooledConnections */ - private ConnectionPoolDataSource dataSource = null; + private ConnectionPoolDataSource dataSource; /** DataSource Name used to find the ConnectionPoolDataSource */ - private String dataSourceName = null; + private String dataSourceName; /** Description */ - private String description = null; + private String description; /** Environment that may be used to set up a jndi initial context. */ - private Properties jndiEnvironment = null; + private Properties jndiEnvironment; /** Login TimeOut in seconds */ - private int loginTimeout = 0; + private int loginTimeout; /** Log stream */ - private PrintWriter logWriter = null; + private PrintWriter logWriter; /** Instance key */ - private String instanceKey = null; + private String instanceKey; // Pool properties - private boolean defaultBlockWhenExhausted = - BaseObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED; - private String defaultEvictionPolicyClassName = - BaseObjectPoolConfig.DEFAULT_EVICTION_POLICY_CLASS_NAME; + private boolean defaultBlockWhenExhausted = BaseObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED; + private String defaultEvictionPolicyClassName = BaseObjectPoolConfig.DEFAULT_EVICTION_POLICY_CLASS_NAME; private boolean defaultLifo = BaseObjectPoolConfig.DEFAULT_LIFO; - private int defaultMaxIdle = - GenericKeyedObjectPoolConfig.DEFAULT_MAX_IDLE_PER_KEY; - private int defaultMaxTotal = - GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL; - private long defaultMaxWaitMillis = - BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS; - private long defaultMinEvictableIdleTimeMillis = - BaseObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; - private int defaultMinIdle = - GenericKeyedObjectPoolConfig.DEFAULT_MIN_IDLE_PER_KEY; - private int defaultNumTestsPerEvictionRun = - BaseObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN; - private long defaultSoftMinEvictableIdleTimeMillis = - BaseObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS; - private boolean defaultTestOnCreate = - BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE; - private boolean defaultTestOnBorrow = - BaseObjectPoolConfig.DEFAULT_TEST_ON_BORROW; - private boolean defaultTestOnReturn = - BaseObjectPoolConfig.DEFAULT_TEST_ON_RETURN; - private boolean defaultTestWhileIdle = - BaseObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE; - private long defaultTimeBetweenEvictionRunsMillis = - BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; + private int defaultMaxIdle = GenericKeyedObjectPoolConfig.DEFAULT_MAX_IDLE_PER_KEY; + private int defaultMaxTotal = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL; + private long defaultMaxWaitMillis = BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS; + private long defaultMinEvictableIdleTimeMillis = BaseObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + private int defaultMinIdle = GenericKeyedObjectPoolConfig.DEFAULT_MIN_IDLE_PER_KEY; + private int defaultNumTestsPerEvictionRun = BaseObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN; + private long defaultSoftMinEvictableIdleTimeMillis = BaseObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + private boolean defaultTestOnCreate = BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE; + private boolean defaultTestOnBorrow = BaseObjectPoolConfig.DEFAULT_TEST_ON_BORROW; + private boolean defaultTestOnReturn = BaseObjectPoolConfig.DEFAULT_TEST_ON_RETURN; + private boolean defaultTestWhileIdle = BaseObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE; + private long defaultTimeBetweenEvictionRunsMillis = BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; // Connection factory properties - private String validationQuery = null; - private int validationQueryTimeout = -1; - private boolean rollbackAfterValidation = false; + private String validationQuery; + private int validationQueryTimeoutSeconds = -1; + private boolean rollbackAfterValidation; private long maxConnLifetimeMillis = -1; // Connection properties - private Boolean defaultAutoCommit = null; + private Boolean defaultAutoCommit; private int defaultTransactionIsolation = UNKNOWN_TRANSACTIONISOLATION; - private Boolean defaultReadOnly = null; - + private Boolean defaultReadOnly; /** * Default no-arg constructor for Serialization @@ -173,18 +145,16 @@ public abstract class InstanceKeyDataSou } /** - * Throws an IllegalStateException, if a PooledConnection has already - * been requested. + * Throws an IllegalStateException, if a PooledConnection has already been requested. */ - protected void assertInitializationAllowed() - throws IllegalStateException { + protected void assertInitializationAllowed() throws IllegalStateException { if (getConnectionCalled) { throw new IllegalStateException(GET_CONNECTION_CALLED); } } /** - * Close the connection pool being maintained by this datasource. + * Closes the connection pool being maintained by this datasource. */ @Override public abstract void close() throws Exception; @@ -208,24 +178,25 @@ public abstract class InstanceKeyDataSou throw new SQLFeatureNotSupportedException(); } - // ------------------------------------------------------------------- // Properties /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getBlockWhenExhausted()} for each per - * user pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getBlockWhenExhausted()} for each per user pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getBlockWhenExhausted()} for each per user + * pool. */ public boolean getDefaultBlockWhenExhausted() { return this.defaultBlockWhenExhausted; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getBlockWhenExhausted()} for each per - * user pool. - * @param blockWhenExhausted The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getBlockWhenExhausted()} for each per user pool. + * + * @param blockWhenExhausted + * The default value for {@link GenericKeyedObjectPoolConfig#getBlockWhenExhausted()} for each per user + * pool. */ public void setDefaultBlockWhenExhausted(final boolean blockWhenExhausted) { assertInitializationAllowed(); @@ -233,38 +204,43 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getEvictionPolicyClassName()} for - * each per user pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getEvictionPolicyClassName()} for each per user + * pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getEvictionPolicyClassName()} for each per user + * pool. */ public String getDefaultEvictionPolicyClassName() { return this.defaultEvictionPolicyClassName; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getEvictionPolicyClassName()} for - * each per user pool. - * @param evictionPolicyClassName The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getEvictionPolicyClassName()} for each per user + * pool. + * + * @param evictionPolicyClassName + * The default value for {@link GenericKeyedObjectPoolConfig#getEvictionPolicyClassName()} for each per + * user pool. */ - public void setDefaultEvictionPolicyClassName( - final String evictionPolicyClassName) { + public void setDefaultEvictionPolicyClassName(final String evictionPolicyClassName) { assertInitializationAllowed(); this.defaultEvictionPolicyClassName = evictionPolicyClassName; } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getLifo()} for each per user pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getLifo()} for each per user pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getLifo()} for each per user pool. */ public boolean getDefaultLifo() { return this.defaultLifo; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getLifo()} for each per user pool. - * @param lifo The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getLifo()} for each per user pool. + * + * @param lifo + * The default value for {@link GenericKeyedObjectPoolConfig#getLifo()} for each per user pool. */ public void setDefaultLifo(final boolean lifo) { assertInitializationAllowed(); @@ -272,19 +248,19 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getMaxIdlePerKey()} for each per user - * pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getMaxIdlePerKey()} for each per user pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getMaxIdlePerKey()} for each per user pool. */ public int getDefaultMaxIdle() { return this.defaultMaxIdle; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getMaxIdlePerKey()} for each per user - * pool. - * @param maxIdle The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getMaxIdlePerKey()} for each per user pool. + * + * @param maxIdle + * The default value for {@link GenericKeyedObjectPoolConfig#getMaxIdlePerKey()} for each per user pool. */ public void setDefaultMaxIdle(final int maxIdle) { assertInitializationAllowed(); @@ -292,19 +268,19 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getMaxTotalPerKey()} for each per - * user pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getMaxTotalPerKey()} for each per user pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getMaxTotalPerKey()} for each per user pool. */ public int getDefaultMaxTotal() { return this.defaultMaxTotal; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getMaxTotalPerKey()} for each per - * user pool. - * @param maxTotal The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getMaxTotalPerKey()} for each per user pool. + * + * @param maxTotal + * The default value for {@link GenericKeyedObjectPoolConfig#getMaxTotalPerKey()} for each per user pool. */ public void setDefaultMaxTotal(final int maxTotal) { assertInitializationAllowed(); @@ -312,19 +288,19 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getMaxWaitMillis()} for each per user - * pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getMaxWaitMillis()} for each per user pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getMaxWaitMillis()} for each per user pool. */ public long getDefaultMaxWaitMillis() { return this.defaultMaxWaitMillis; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getMaxWaitMillis()} for each per user - * pool. - * @param maxWaitMillis The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getMaxWaitMillis()} for each per user pool. + * + * @param maxWaitMillis + * The default value for {@link GenericKeyedObjectPoolConfig#getMaxWaitMillis()} for each per user pool. */ public void setDefaultMaxWaitMillis(final long maxWaitMillis) { assertInitializationAllowed(); @@ -332,40 +308,43 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getMinEvictableIdleTimeMillis()} for - * each per user pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getMinEvictableIdleTimeMillis()} for each per user + * pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getMinEvictableIdleTimeMillis()} for each per + * user pool. */ public long getDefaultMinEvictableIdleTimeMillis() { return this.defaultMinEvictableIdleTimeMillis; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getMinEvictableIdleTimeMillis()} for - * each per user pool. - * @param minEvictableIdleTimeMillis The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getMinEvictableIdleTimeMillis()} for each per user + * pool. + * + * @param minEvictableIdleTimeMillis + * The default value for {@link GenericKeyedObjectPoolConfig#getMinEvictableIdleTimeMillis()} for each + * per user pool. */ - public void setDefaultMinEvictableIdleTimeMillis( - final long minEvictableIdleTimeMillis) { + public void setDefaultMinEvictableIdleTimeMillis(final long minEvictableIdleTimeMillis) { assertInitializationAllowed(); this.defaultMinEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getMinIdlePerKey()} for each per user - * pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getMinIdlePerKey()} for each per user pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getMinIdlePerKey()} for each per user pool. */ public int getDefaultMinIdle() { return this.defaultMinIdle; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getMinIdlePerKey()} for each per user - * pool. - * @param minIdle The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getMinIdlePerKey()} for each per user pool. + * + * @param minIdle + * The default value for {@link GenericKeyedObjectPoolConfig#getMinIdlePerKey()} for each per user pool. */ public void setDefaultMinIdle(final int minIdle) { assertInitializationAllowed(); @@ -373,19 +352,23 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link GenericKeyedObjectPoolConfig#getNumTestsPerEvictionRun()} for each - * per user pool. + * Gets the default value for {@link GenericKeyedObjectPoolConfig#getNumTestsPerEvictionRun()} for each per user + * pool. + * + * @return The default value for {@link GenericKeyedObjectPoolConfig#getNumTestsPerEvictionRun()} for each per user + * pool. */ public int getDefaultNumTestsPerEvictionRun() { return this.defaultNumTestsPerEvictionRun; } /** - * Sets the default value for - * {@link GenericKeyedObjectPoolConfig#getNumTestsPerEvictionRun()} for each - * per user pool. - * @param numTestsPerEvictionRun The new value + * Sets the default value for {@link GenericKeyedObjectPoolConfig#getNumTestsPerEvictionRun()} for each per user + * pool. + * + * @param numTestsPerEvictionRun + * The default value for {@link GenericKeyedObjectPoolConfig#getNumTestsPerEvictionRun()} for each per + * user pool. */ public void setDefaultNumTestsPerEvictionRun(final int numTestsPerEvictionRun) { assertInitializationAllowed(); @@ -393,37 +376,47 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getSoftMinEvictableIdleTimeMillis()} for each - * per user pool. + * Gets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getSoftMinEvictableIdleTimeMillis()} for each per user pool. + * + * @return The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getSoftMinEvictableIdleTimeMillis()} for each per user pool. */ public long getDefaultSoftMinEvictableIdleTimeMillis() { return this.defaultSoftMinEvictableIdleTimeMillis; } /** - * Sets the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getSoftMinEvictableIdleTimeMillis()} for each per user pool. - * @param softMinEvictableIdleTimeMillis The new value + * Sets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getSoftMinEvictableIdleTimeMillis()} for each per user pool. + * + * @param softMinEvictableIdleTimeMillis + * The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getSoftMinEvictableIdleTimeMillis()} for each per user pool. */ - public void setDefaultSoftMinEvictableIdleTimeMillis( - final long softMinEvictableIdleTimeMillis) { + public void setDefaultSoftMinEvictableIdleTimeMillis(final long softMinEvictableIdleTimeMillis) { assertInitializationAllowed(); this.defaultSoftMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis; } /** - * @return the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestOnCreate()} for each per user pool. + * Gets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnCreate()} for each per user pool. + * + * @return The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnCreate()} for each per user pool. */ public boolean getDefaultTestOnCreate() { return this.defaultTestOnCreate; } /** - * Sets the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestOnCreate()} for each per user pool. - * @param testOnCreate The new value + * Sets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnCreate()} for each per user pool. + * + * @param testOnCreate + * The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnCreate()} for each per user pool. */ public void setDefaultTestOnCreate(final boolean testOnCreate) { assertInitializationAllowed(); @@ -431,17 +424,23 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestOnBorrow()} for each per user pool. + * Gets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnBorrow()} for each per user pool. + * + * @return The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnBorrow()} for each per user pool. */ public boolean getDefaultTestOnBorrow() { return this.defaultTestOnBorrow; } /** - * Sets the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestOnBorrow()} for each per user pool. - * @param testOnBorrow The new value + * Sets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnBorrow()} for each per user pool. + * + * @param testOnBorrow + * The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnBorrow()} for each per user pool. */ public void setDefaultTestOnBorrow(final boolean testOnBorrow) { assertInitializationAllowed(); @@ -449,17 +448,23 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestOnReturn()} for each per user pool. + * Gets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnReturn()} for each per user pool. + * + * @return The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnReturn()} for each per user pool. */ public boolean getDefaultTestOnReturn() { return this.defaultTestOnReturn; } /** - * Sets the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestOnReturn()} for each per user pool. - * @param testOnReturn The new value + * Sets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnReturn()} for each per user pool. + * + * @param testOnReturn + * The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestOnReturn()} for each per user pool. */ public void setDefaultTestOnReturn(final boolean testOnReturn) { assertInitializationAllowed(); @@ -467,17 +472,23 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestWhileIdle()} for each per user pool. + * Gets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestWhileIdle()} for each per user pool. + * + * @return The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestWhileIdle()} for each per user pool. */ public boolean getDefaultTestWhileIdle() { return this.defaultTestWhileIdle; } /** - * Sets the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTestWhileIdle()} for each per user pool. - * @param testWhileIdle The new value + * Sets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestWhileIdle()} for each per user pool. + * + * @param testWhileIdle + * The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTestWhileIdle()} for each per user pool. */ public void setDefaultTestWhileIdle(final boolean testWhileIdle) { assertInitializationAllowed(); @@ -485,29 +496,32 @@ public abstract class InstanceKeyDataSou } /** - * @return the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTimeBetweenEvictionRunsMillis ()} for each - * per user pool. + * Gets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTimeBetweenEvictionRunsMillis ()} for each per user pool. + * + * @return The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTimeBetweenEvictionRunsMillis ()} for each per user pool. */ - public long getDefaultTimeBetweenEvictionRunsMillis () { - return this.defaultTimeBetweenEvictionRunsMillis ; + public long getDefaultTimeBetweenEvictionRunsMillis() { + return this.defaultTimeBetweenEvictionRunsMillis; } /** - * Sets the default value for - * {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool#getTimeBetweenEvictionRunsMillis ()} for each - * per user pool. - * @param timeBetweenEvictionRunsMillis The new value + * Sets the default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTimeBetweenEvictionRunsMillis ()} for each per user pool. + * + * @param timeBetweenEvictionRunsMillis + * The default value for {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool + * GenericObjectPool#getTimeBetweenEvictionRunsMillis ()} for each per user pool. */ - public void setDefaultTimeBetweenEvictionRunsMillis ( - final long timeBetweenEvictionRunsMillis ) { + public void setDefaultTimeBetweenEvictionRunsMillis(final long timeBetweenEvictionRunsMillis) { assertInitializationAllowed(); - this.defaultTimeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis ; + this.defaultTimeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } /** - * Get the value of connectionPoolDataSource. This method will return - * null, if the backing datasource is being accessed via jndi. + * Gets the value of connectionPoolDataSource. This method will return null, if the backing datasource is being + * accessed via jndi. * * @return value of connectionPoolDataSource. */ @@ -516,30 +530,27 @@ public abstract class InstanceKeyDataSou } /** - * Set the backend ConnectionPoolDataSource. This property should not be - * set if using jndi to access the datasource. + * Sets the backend ConnectionPoolDataSource. This property should not be set if using jndi to access the + * datasource. * - * @param v Value to assign to connectionPoolDataSource. + * @param v + * Value to assign to connectionPoolDataSource. */ public void setConnectionPoolDataSource(final ConnectionPoolDataSource v) { assertInitializationAllowed(); if (dataSourceName != null) { - throw new IllegalStateException( - "Cannot set the DataSource, if JNDI is used."); + throw new IllegalStateException("Cannot set the DataSource, if JNDI is used."); } - if (dataSource != null) - { - throw new IllegalStateException( - "The CPDS has already been set. It cannot be altered."); + if (dataSource != null) { + throw new IllegalStateException("The CPDS has already been set. It cannot be altered."); } dataSource = v; instanceKey = InstanceKeyDataSourceFactory.registerNewInstance(this); } /** - * Get the name of the ConnectionPoolDataSource which backs this pool. - * This name is used to look up the datasource from a jndi service - * provider. + * Gets the name of the ConnectionPoolDataSource which backs this pool. This name is used to look up the datasource + * from a jndi service provider. * * @return value of dataSourceName. */ @@ -548,35 +559,29 @@ public abstract class InstanceKeyDataSou } /** - * Set the name of the ConnectionPoolDataSource which backs this pool. - * This name is used to look up the datasource from a jndi service - * provider. + * Sets the name of the ConnectionPoolDataSource which backs this pool. This name is used to look up the datasource + * from a jndi service provider. * - * @param v Value to assign to dataSourceName. + * @param v + * Value to assign to dataSourceName. */ public void setDataSourceName(final String v) { assertInitializationAllowed(); if (dataSource != null) { - throw new IllegalStateException( - "Cannot set the JNDI name for the DataSource, if already " + - "set using setConnectionPoolDataSource."); - } - if (dataSourceName != null) - { - throw new IllegalStateException( - "The DataSourceName has already been set. " + - "It cannot be altered."); + throw new IllegalStateException("Cannot set the JNDI name for the DataSource, if already " + + "set using setConnectionPoolDataSource."); + } + if (dataSourceName != null) { + throw new IllegalStateException("The DataSourceName has already been set. " + "It cannot be altered."); } this.dataSourceName = v; instanceKey = InstanceKeyDataSourceFactory.registerNewInstance(this); } /** - * Get the value of defaultAutoCommit, which defines the state of - * connections handed out from this pool. The value can be changed - * on the Connection using Connection.setAutoCommit(boolean). - * The default is <code>null</code> which will use the default value for the - * drive. + * Gets the value of defaultAutoCommit, which defines the state of connections handed out from this pool. The value + * can be changed on the Connection using Connection.setAutoCommit(boolean). The default is <code>null</code> which + * will use the default value for the drive. * * @return value of defaultAutoCommit. */ @@ -585,13 +590,12 @@ public abstract class InstanceKeyDataSou } /** - * Set the value of defaultAutoCommit, which defines the state of - * connections handed out from this pool. The value can be changed - * on the Connection using Connection.setAutoCommit(boolean). - * The default is <code>null</code> which will use the default value for the - * drive. + * Sets the value of defaultAutoCommit, which defines the state of connections handed out from this pool. The value + * can be changed on the Connection using Connection.setAutoCommit(boolean). The default is <code>null</code> which + * will use the default value for the drive. * - * @param v Value to assign to defaultAutoCommit. + * @param v + * Value to assign to defaultAutoCommit. */ public void setDefaultAutoCommit(final Boolean v) { assertInitializationAllowed(); @@ -599,11 +603,9 @@ public abstract class InstanceKeyDataSou } /** - * Get the value of defaultReadOnly, which defines the state of - * connections handed out from this pool. The value can be changed - * on the Connection using Connection.setReadOnly(boolean). - * The default is <code>null</code> which will use the default value for the - * drive. + * Gets the value of defaultReadOnly, which defines the state of connections handed out from this pool. The value + * can be changed on the Connection using Connection.setReadOnly(boolean). The default is <code>null</code> which + * will use the default value for the drive. * * @return value of defaultReadOnly. */ @@ -612,13 +614,12 @@ public abstract class InstanceKeyDataSou } /** - * Set the value of defaultReadOnly, which defines the state of - * connections handed out from this pool. The value can be changed - * on the Connection using Connection.setReadOnly(boolean). - * The default is <code>null</code> which will use the default value for the - * drive. + * Sets the value of defaultReadOnly, which defines the state of connections handed out from this pool. The value + * can be changed on the Connection using Connection.setReadOnly(boolean). The default is <code>null</code> which + * will use the default value for the drive. * - * @param v Value to assign to defaultReadOnly. + * @param v + * Value to assign to defaultReadOnly. */ public void setDefaultReadOnly(final Boolean v) { assertInitializationAllowed(); @@ -626,10 +627,9 @@ public abstract class InstanceKeyDataSou } /** - * Get the value of defaultTransactionIsolation, which defines the state of - * connections handed out from this pool. The value can be changed - * on the Connection using Connection.setTransactionIsolation(int). - * If this method returns -1, the default is JDBC driver dependent. + * Gets the value of defaultTransactionIsolation, which defines the state of connections handed out from this pool. + * The value can be changed on the Connection using Connection.setTransactionIsolation(int). If this method returns + * -1, the default is JDBC driver dependent. * * @return value of defaultTransactionIsolation. */ @@ -638,12 +638,12 @@ public abstract class InstanceKeyDataSou } /** - * Set the value of defaultTransactionIsolation, which defines the state of - * connections handed out from this pool. The value can be changed - * on the Connection using Connection.setTransactionIsolation(int). - * The default is JDBC driver dependent. + * Sets the value of defaultTransactionIsolation, which defines the state of connections handed out from this pool. + * The value can be changed on the Connection using Connection.setTransactionIsolation(int). The default is JDBC + * driver dependent. * - * @param v Value to assign to defaultTransactionIsolation + * @param v + * Value to assign to defaultTransactionIsolation */ public void setDefaultTransactionIsolation(final int v) { assertInitializationAllowed(); @@ -661,9 +661,8 @@ public abstract class InstanceKeyDataSou } /** - * Get the description. This property is defined by JDBC as for use with - * GUI (or other) tools that might deploy the datasource. It serves no - * internal purpose. + * Gets the description. This property is defined by JDBC as for use with GUI (or other) tools that might deploy the + * datasource. It serves no internal purpose. * * @return value of description. */ @@ -672,11 +671,11 @@ public abstract class InstanceKeyDataSou } /** - * Set the description. This property is defined by JDBC as for use with - * GUI (or other) tools that might deploy the datasource. It serves no - * internal purpose. + * Sets the description. This property is defined by JDBC as for use with GUI (or other) tools that might deploy the + * datasource. It serves no internal purpose. * - * @param v Value to assign to description. + * @param v + * Value to assign to description. */ public void setDescription(final String v) { this.description = v; @@ -687,10 +686,11 @@ public abstract class InstanceKeyDataSou } /** - * Get the value of jndiEnvironment which is used when instantiating - * a jndi InitialContext. This InitialContext is used to locate the - * backend ConnectionPoolDataSource. - * @param key The environment property name + * Gets the value of jndiEnvironment which is used when instantiating a JNDI InitialContext. This InitialContext is + * used to locate the backend ConnectionPoolDataSource. + * + * @param key + * JNDI environment key. * @return value of jndiEnvironment. */ public String getJndiEnvironment(final String key) { @@ -702,12 +702,13 @@ public abstract class InstanceKeyDataSou } /** - * Sets the value of the given JNDI environment property to be used when - * instantiating a JNDI InitialContext. This InitialContext is used to - * locate the backend ConnectionPoolDataSource. + * Sets the value of the given JNDI environment property to be used when instantiating a JNDI InitialContext. This + * InitialContext is used to locate the backend ConnectionPoolDataSource. * - * @param key the JNDI environment property to set. - * @param value the value assigned to specified JNDI environment property. + * @param key + * the JNDI environment property to set. + * @param value + * the value assigned to specified JNDI environment property. */ public void setJndiEnvironment(final String key, final String value) { if (jndiEnvironment == null) { @@ -717,12 +718,11 @@ public abstract class InstanceKeyDataSou } /** - * Sets the JNDI environment to be used when instantiating a JNDI - * InitialContext. This InitialContext is used to locate the backend - * ConnectionPoolDataSource. + * Sets the JNDI environment to be used when instantiating a JNDI InitialContext. This InitialContext is used to + * locate the backend ConnectionPoolDataSource. * - * @param properties the JNDI environment property to set which will - * overwrite any current settings + * @param properties + * the JNDI environment property to set which will overwrite any current settings */ void setJndiEnvironment(final Properties properties) { if (jndiEnvironment == null) { @@ -734,7 +734,8 @@ public abstract class InstanceKeyDataSou } /** - * Get the value of loginTimeout. + * Gets the value of loginTimeout. + * * @return value of loginTimeout. */ @Override @@ -743,8 +744,10 @@ public abstract class InstanceKeyDataSou } /** - * Set the value of loginTimeout. - * @param v Value to assign to loginTimeout. + * Sets the value of loginTimeout. + * + * @param v + * Value to assign to loginTimeout. */ @Override public void setLoginTimeout(final int v) { @@ -752,21 +755,23 @@ public abstract class InstanceKeyDataSou } /** - * Get the value of logWriter. + * Gets the value of logWriter. + * * @return value of logWriter. */ @Override public PrintWriter getLogWriter() { if (logWriter == null) { - logWriter = new PrintWriter( - new OutputStreamWriter(System.out, StandardCharsets.UTF_8)); + logWriter = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8)); } return logWriter; } /** - * Set the value of logWriter. - * @param v Value to assign to logWriter. + * Sets the value of logWriter. + * + * @param v + * Value to assign to logWriter. */ @Override public void setLogWriter(final PrintWriter v) { @@ -774,24 +779,25 @@ public abstract class InstanceKeyDataSou } /** - * The SQL query that will be used to validate connections from this pool - * before returning them to the caller. If specified, this query - * <strong>MUST</strong> be an SQL SELECT statement that returns at least - * one row. If not specified, {@link Connection#isValid(int)} will be used - * to validate connections. - * @return the validation query + * Gets the SQL query that will be used to validate connections from this pool before returning them to the caller. + * If specified, this query <strong>MUST</strong> be an SQL SELECT statement that returns at least one row. If not + * specified, {@link Connection#isValid(int)} will be used to validate connections. + * + * @return The SQL query that will be used to validate connections from this pool before returning them to the + * caller. */ public String getValidationQuery() { return this.validationQuery; } /** - * The SQL query that will be used to validate connections from this pool - * before returning them to the caller. If specified, this query - * <strong>MUST</strong> be an SQL SELECT statement that returns at least - * one row. If not specified, connections will be validated using - * {@link Connection#isValid(int)}. - * @param validationQuery The validation query + * Sets the SQL query that will be used to validate connections from this pool before returning them to the caller. + * If specified, this query <strong>MUST</strong> be an SQL SELECT statement that returns at least one row. If not + * specified, connections will be validated using {@link Connection#isValid(int)}. + * + * @param validationQuery + * The SQL query that will be used to validate connections from this pool before returning them to the + * caller. */ public void setValidationQuery(final String validationQuery) { assertInitializationAllowed(); @@ -799,41 +805,41 @@ public abstract class InstanceKeyDataSou } /** - * @return the timeout in seconds before the validation query fails. + * Returns the timeout in seconds before the validation query fails. + * + * @return The timeout in seconds before the validation query fails. */ public int getValidationQueryTimeout() { - return validationQueryTimeout; + return validationQueryTimeoutSeconds; } /** * Sets the timeout in seconds before the validation query fails. * - * @param validationQueryTimeout The new timeout in seconds + * @param validationQueryTimeoutSeconds + * The new timeout in seconds */ - public void setValidationQueryTimeout(final int validationQueryTimeout) { - this.validationQueryTimeout = validationQueryTimeout; + public void setValidationQueryTimeout(final int validationQueryTimeoutSeconds) { + this.validationQueryTimeoutSeconds = validationQueryTimeoutSeconds; } /** - * Whether a rollback will be issued after executing the SQL query - * that will be used to validate connections from this pool - * before returning them to the caller. + * Whether a rollback will be issued after executing the SQL query that will be used to validate connections from + * this pool before returning them to the caller. * - * @return true if a rollback will be issued after executing the - * validation query + * @return true if a rollback will be issued after executing the validation query */ public boolean isRollbackAfterValidation() { return this.rollbackAfterValidation; } /** - * Whether a rollback will be issued after executing the SQL query - * that will be used to validate connections from this pool - * before returning them to the caller. Default behavior is NOT - * to issue a rollback. The setting will only have an effect - * if a validation query is set + * Whether a rollback will be issued after executing the SQL query that will be used to validate connections from + * this pool before returning them to the caller. Default behavior is NOT to issue a rollback. The setting will only + * have an effect if a validation query is set * - * @param rollbackAfterValidation new property value + * @param rollbackAfterValidation + * new property value */ public void setRollbackAfterValidation(final boolean rollbackAfterValidation) { assertInitializationAllowed(); @@ -841,22 +847,30 @@ public abstract class InstanceKeyDataSou } /** - * @return the maximum permitted lifetime of a connection in milliseconds. A - * value of zero or less indicates an infinite lifetime. + * Returns the maximum permitted lifetime of a connection in milliseconds. A value of zero or less indicates an + * infinite lifetime. + * + * @return The maximum permitted lifetime of a connection in milliseconds. A value of zero or less indicates an + * infinite lifetime. */ public long getMaxConnLifetimeMillis() { return maxConnLifetimeMillis; } /** - * <p>Sets the maximum permitted lifetime of a connection in - * milliseconds. A value of zero or less indicates an infinite lifetime.</p> * <p> - * Note: this method currently has no effect once the pool has been - * initialized. The pool is initialized the first time one of the - * following methods is invoked: <code>getConnection, setLogwriter, - * setLoginTimeout, getLoginTimeout, getLogWriter.</code></p> - * @param maxConnLifetimeMillis The maximum connection lifetime + * Sets the maximum permitted lifetime of a connection in milliseconds. A value of zero or less indicates an + * infinite lifetime. + * </p> + * <p> + * Note: this method currently has no effect once the pool has been initialized. The pool is initialized the first + * time one of the following methods is invoked: <code>getConnection, setLogwriter, + * setLoginTimeout, getLoginTimeout, getLogWriter.</code> + * </p> + * + * @param maxConnLifetimeMillis + * The maximum permitted lifetime of a connection in milliseconds. A value of zero or less indicates an + * infinite lifetime. */ public void setMaxConnLifetimeMillis(final long maxConnLifetimeMillis) { this.maxConnLifetimeMillis = maxConnLifetimeMillis; @@ -869,9 +883,7 @@ public abstract class InstanceKeyDataSou // DataSource implementation /** - * Attempt to establish a database connection. - * @return the connection - * @throws SQLException Connection failed + * Attempts to establish a database connection. */ @Override public Connection getConnection() throws SQLException { @@ -879,32 +891,26 @@ public abstract class InstanceKeyDataSou } /** - * Attempt to retrieve a database connection using {@link #getPooledConnectionAndInfo(String, String)} - * with the provided username and password. The password on the {@link PooledConnectionAndInfo} - * instance returned by <code>getPooledConnectionAndInfo</code> is compared to the <code>password</code> - * parameter. If the comparison fails, a database connection using the supplied username and password - * is attempted. If the connection attempt fails, an SQLException is thrown, indicating that the given password - * did not match the password used to create the pooled connection. If the connection attempt succeeds, this - * means that the database password has been changed. In this case, the <code>PooledConnectionAndInfo</code> - * instance retrieved with the old password is destroyed and the <code>getPooledConnectionAndInfo</code> is - * repeatedly invoked until a <code>PooledConnectionAndInfo</code> instance with the new password is returned. - * @param username The user name to use to connect - * @param password The password - * @return the connection - * @throws SQLException Connection failed + * Attempts to retrieve a database connection using {@link #getPooledConnectionAndInfo(String, String)} with the + * provided user name and password. The password on the {@link PooledConnectionAndInfo} instance returned by + * <code>getPooledConnectionAndInfo</code> is compared to the <code>password</code> parameter. If the comparison + * fails, a database connection using the supplied user name and password is attempted. If the connection attempt + * fails, an SQLException is thrown, indicating that the given password did not match the password used to create + * the pooled connection. If the connection attempt succeeds, this means that the database password has been + * changed. In this case, the <code>PooledConnectionAndInfo</code> instance retrieved with the old password is + * destroyed and the <code>getPooledConnectionAndInfo</code> is repeatedly invoked until a + * <code>PooledConnectionAndInfo</code> instance with the new password is returned. */ @Override - public Connection getConnection(final String username, final String password) - throws SQLException { + public Connection getConnection(final String userName, final String userPassword) throws SQLException { if (instanceKey == null) { throw new SQLException("Must set the ConnectionPoolDataSource " - + "through setDataSourceName or setConnectionPoolDataSource" - + " before calling getConnection."); + + "through setDataSourceName or setConnectionPoolDataSource" + " before calling getConnection."); } getConnectionCalled = true; PooledConnectionAndInfo info = null; try { - info = getPooledConnectionAndInfo(username, password); + info = getPooledConnectionAndInfo(userName, userPassword); } catch (final NoSuchElementException e) { closeDueToException(info); throw new SQLException("Cannot borrow connection from pool", e); @@ -919,18 +925,17 @@ public abstract class InstanceKeyDataSou throw new SQLException("Cannot borrow connection from pool", e); } - if (!(null == password ? null == info.getPassword() - : password.equals(info.getPassword()))) { // Password on PooledConnectionAndInfo does not match + // Password on PooledConnectionAndInfo does not match + if (!(null == userPassword ? null == info.getPassword() : userPassword.equals(info.getPassword()))) { try { // See if password has changed by attempting connection - testCPDS(username, password); + testCPDS(userName, userPassword); } catch (final SQLException ex) { // Password has not changed, so refuse client, but return connection to the pool closeDueToException(info); - throw new SQLException("Given password did not match password used" - + " to create the PooledConnection.", ex); - } catch (final javax.naming.NamingException ne) { throw new SQLException( - "NamingException encountered connecting to database", ne); + "Given password did not match password used" + " to create the PooledConnection.", ex); + } catch (final javax.naming.NamingException ne) { + throw new SQLException("NamingException encountered connecting to database", ne); } /* * Password must have changed -> destroy connection and keep retrying until we get a new, good one, @@ -938,12 +943,14 @@ public abstract class InstanceKeyDataSou */ final UserPassKey upkey = info.getUserPassKey(); final PooledConnectionManager manager = getConnectionManager(upkey); - manager.invalidate(info.getPooledConnection()); // Destroy and remove from pool - manager.setPassword(upkey.getPassword()); // Reset the password on the factory if using CPDSConnectionFactory + // Destroy and remove from pool + manager.invalidate(info.getPooledConnection()); + // Reset the password on the factory if using CPDSConnectionFactory + manager.setPassword(upkey.getPassword()); info = null; for (int i = 0; i < 10; i++) { // Bound the number of retries - only needed if bad instances return try { - info = getPooledConnectionAndInfo(username, password); + info = getPooledConnectionAndInfo(userName, userPassword); } catch (final NoSuchElementException e) { closeDueToException(info); throw new SQLException("Cannot borrow connection from pool", e); @@ -957,7 +964,7 @@ public abstract class InstanceKeyDataSou closeDueToException(info); throw new SQLException("Cannot borrow connection from pool", e); } - if (info != null && password != null && password.equals(info.getPassword())) { + if (info != null && userPassword != null && userPassword.equals(info.getPassword())) { break; } if (info != null) { @@ -972,27 +979,23 @@ public abstract class InstanceKeyDataSou final Connection con = info.getPooledConnection().getConnection(); try { - setupDefaults(con, username); + setupDefaults(con, userName); con.clearWarnings(); return con; } catch (final SQLException ex) { try { con.close(); } catch (final Exception exc) { - getLogWriter().println( - "ignoring exception during close: " + exc); + getLogWriter().println("ignoring exception during close: " + exc); } throw ex; } } - protected abstract PooledConnectionAndInfo - getPooledConnectionAndInfo(String username, String password) - throws SQLException; - - protected abstract void setupDefaults(Connection con, String username) - throws SQLException; + protected abstract PooledConnectionAndInfo getPooledConnectionAndInfo(String userName, String userPassword) + throws SQLException; + protected abstract void setupDefaults(Connection connection, String userName) throws SQLException; private void closeDueToException(final PooledConnectionAndInfo info) { if (info != null) { @@ -1000,17 +1003,16 @@ public abstract class InstanceKeyDataSou info.getPooledConnection().getConnection().close(); } catch (final Exception e) { // do not throw this exception because we are in the middle - // of handling another exception. But record it because + // of handling another exception. But record it because // it potentially leaks connections from the pool. - getLogWriter().println("[ERROR] Could not return connection to " - + "pool during exception handling. " + e.getMessage()); + getLogWriter().println("[ERROR] Could not return connection to " + "pool during exception handling. " + + e.getMessage()); } } } - protected ConnectionPoolDataSource - testCPDS(final String username, final String password) - throws javax.naming.NamingException, SQLException { + protected ConnectionPoolDataSource testCPDS(final String userName, final String userPassword) + throws javax.naming.NamingException, SQLException { // The source of physical db connections ConnectionPoolDataSource cpds = this.dataSource; if (cpds == null) { @@ -1024,33 +1026,27 @@ public abstract class InstanceKeyDataSou if (ds instanceof ConnectionPoolDataSource) { cpds = (ConnectionPoolDataSource) ds; } else { - throw new SQLException("Illegal configuration: " - + "DataSource " + dataSourceName - + " (" + ds.getClass().getName() + ")" - + " doesn't implement javax.sql.ConnectionPoolDataSource"); + throw new SQLException("Illegal configuration: " + "DataSource " + dataSourceName + " (" + + ds.getClass().getName() + ")" + " doesn't implement javax.sql.ConnectionPoolDataSource"); } } - // try to get a connection with the supplied username/password + // try to get a connection with the supplied userName/password PooledConnection conn = null; try { - if (username != null) { - conn = cpds.getPooledConnection(username, password); - } - else { + if (userName != null) { + conn = cpds.getPooledConnection(userName, userPassword); + } else { conn = cpds.getPooledConnection(); } if (conn == null) { - throw new SQLException( - "Cannot connect using the supplied username/password"); + throw new SQLException("Cannot connect using the supplied userName/password"); } - } - finally { + } finally { if (conn != null) { try { conn.close(); - } - catch (final SQLException e) { + } catch (final SQLException e) { // at least we could connect } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org