Javadoc.
authorGary Gregory <garydgregory@gmail.com>
Wed, 14 Nov 2018 02:54:28 +0000 (19:54 -0700)
committerGary Gregory <garydgregory@gmail.com>
Wed, 14 Nov 2018 02:54:28 +0000 (19:54 -0700)
src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
src/main/java/org/apache/commons/dbcp2/DataSourceConnectionFactory.java
src/main/java/org/apache/commons/dbcp2/DriverConnectionFactory.java
src/main/java/org/apache/commons/dbcp2/DriverManagerConnectionFactory.java
src/main/java/org/apache/commons/dbcp2/PoolableConnection.java
src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
src/main/java/org/apache/commons/dbcp2/managed/LocalXAConnectionFactory.java
src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnection.java
src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java

index a944da3..9bda48d 100644 (file)
@@ -1963,7 +1963,7 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
      *
      * @param autoCommitOnReturn
      *            Whether or not connections being returned to the pool will be checked and configured with auto-commit.
-     * @deprecated Use {@linkn #setAutoCommitOnReturn(boolean)}.
+     * @deprecated Use {@link #setAutoCommitOnReturn(boolean)}.
      */
     @Deprecated
     public void setEnableAutoCommitOnReturn(final boolean autoCommitOnReturn) {
index 19a0c18..f18151d 100644 (file)
@@ -86,6 +86,7 @@ public class DataSourceConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The data source.
      * @since 2.6.0
      */
     public DataSource getDataSource() {
@@ -93,6 +94,7 @@ public class DataSourceConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The user name.
      * @since 2.6.0
      */
     public String getUserName() {
@@ -100,6 +102,7 @@ public class DataSourceConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The user password.
      * @since 2.6.0
      */
     public char[] getUserPassword() {
index ba88b76..1b4f5dd 100644 (file)
@@ -54,6 +54,7 @@ public class DriverConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The connection String.
      * @since 2.6.0
      */
     public String getConnectionString() {
@@ -61,6 +62,7 @@ public class DriverConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The Driver.
      * @since 2.6.0
      */
     public Driver getDriver() {
@@ -68,6 +70,7 @@ public class DriverConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The Properties.
      * @since 2.6.0
      */
     public Properties getProperties() {
index eeb1373..c409e73 100644 (file)
@@ -124,6 +124,7 @@ public class DriverManagerConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The connection URI.
      * @since 2.6.0
      */
     public String getConnectionUri() {
@@ -131,6 +132,7 @@ public class DriverManagerConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The Properties.
      * @since 2.6.0
      */
     public Properties getProperties() {
@@ -138,6 +140,7 @@ public class DriverManagerConnectionFactory implements ConnectionFactory {
     }
 
     /**
+     * @return The user name.
      * @since 2.6.0
      */
     public String getUserName() {
index e9924ae..6a6ccf4 100644 (file)
@@ -331,13 +331,7 @@ public class PoolableConnection extends DelegatingConnection<Connection> impleme
     }
 
     /**
-     * @since 2.6.0
-     */
-    public ObjectNameWrapper getJmxObjectName() {
-        return jmxObjectName;
-    }
-
-    /**
+     * @return The disconnection SQL codes.
      * @since 2.6.0
      */
     public Collection<String> getDisconnectionSqlCodes() {
@@ -345,6 +339,7 @@ public class PoolableConnection extends DelegatingConnection<Connection> impleme
     }
 
     /**
+     * @return Whether to fail-fast.
      * @since 2.6.0
      */
     public boolean isFastFailValidation() {
index 604c049..cc91ec4 100644 (file)
@@ -46,6 +46,53 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
     private static final Log log = LogFactory.getLog(PoolableConnectionFactory.class);
 
     /**
+     * Internal constant to indicate the level is not set.
+     */
+    static final int UNKNOWN_TRANSACTION_ISOLATION = -1;
+
+    private final ConnectionFactory connectionFactory;
+
+    private final ObjectName dataSourceJmxObjectName;
+
+    private volatile String validationQuery;
+
+    private volatile int validationQueryTimeoutSeconds = -1;
+
+    private Collection<String> connectionInitSqls;
+
+    private Collection<String> disconnectionSqlCodes;
+
+    private boolean fastFailValidation = true;
+
+    private volatile ObjectPool<PoolableConnection> pool;
+
+    private Boolean defaultReadOnly;
+
+    private Boolean defaultAutoCommit;
+
+    private boolean autoCommitOnReturn = true;
+
+    private boolean rollbackOnReturn = true;
+
+    private int defaultTransactionIsolation = UNKNOWN_TRANSACTION_ISOLATION;
+
+    private String defaultCatalog;
+
+    private String defaultSchema;
+
+    private boolean cacheState;
+
+    private boolean poolStatements;
+
+    private int maxOpenPreparedStatements = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
+
+    private long maxConnLifetimeMillis = -1;
+
+    private final AtomicLong connectionIndex = new AtomicLong(0);
+
+    private Integer defaultQueryTimeoutSeconds;
+
+    /**
      * Creates a new {@code PoolableConnectionFactory}.
      *
      * @param connFactory
@@ -58,198 +105,135 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
         this.dataSourceJmxObjectName = dataSourceJmxObjectName;
     }
 
-    /**
-     * Sets the query I use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. If
-     * not specified, {@link Connection#isValid(int)} will be used to validate connections.
-     *
-     * @param validationQuery
-     *            a query to use to {@link #validateObject validate} {@link Connection}s.
-     */
-    public void setValidationQuery(final String validationQuery) {
-        this.validationQuery = validationQuery;
-    }
+    @Override
+    public void activateObject(final PooledObject<PoolableConnection> p) throws Exception {
 
-    /**
-     * Sets the validation query timeout, the amount of time, in seconds, that connection validation will wait for a
-     * response from the database when executing a validation query. Use a value less than or equal to 0 for no timeout.
-     *
-     * @param validationQueryTimeoutSeconds
-     *            new validation query timeout value in seconds
-     */
-    public void setValidationQueryTimeout(final int validationQueryTimeoutSeconds) {
-        this.validationQueryTimeoutSeconds = validationQueryTimeoutSeconds;
+        validateLifetime(p);
+
+        final PoolableConnection conn = p.getObject();
+        conn.activate();
+
+        if (defaultAutoCommit != null && conn.getAutoCommit() != defaultAutoCommit.booleanValue()) {
+            conn.setAutoCommit(defaultAutoCommit.booleanValue());
+        }
+        if (defaultTransactionIsolation != UNKNOWN_TRANSACTION_ISOLATION
+                && conn.getTransactionIsolation() != defaultTransactionIsolation) {
+            conn.setTransactionIsolation(defaultTransactionIsolation);
+        }
+        if (defaultReadOnly != null && conn.isReadOnly() != defaultReadOnly.booleanValue()) {
+            conn.setReadOnly(defaultReadOnly.booleanValue());
+        }
+        if (defaultCatalog != null && !defaultCatalog.equals(conn.getCatalog())) {
+            conn.setCatalog(defaultCatalog);
+        }
+        if (defaultSchema != null && !defaultSchema.equals(Jdbc41Bridge.getSchema(conn))) {
+            Jdbc41Bridge.setSchema(conn, defaultSchema);
+        }
+        conn.setDefaultQueryTimeout(defaultQueryTimeoutSeconds);
     }
 
-    /**
-     * Sets the SQL statements I use to initialize newly created {@link Connection}s. Using {@code null} turns off
-     * connection initialization.
-     *
-     * @param connectionInitSqls
-     *            SQL statement to initialize {@link Connection}s.
-     */
-    public void setConnectionInitSql(final Collection<String> connectionInitSqls) {
-        this.connectionInitSqls = connectionInitSqls;
+    @Override
+    public void destroyObject(final PooledObject<PoolableConnection> p) throws Exception {
+        p.getObject().reallyClose();
     }
 
     /**
-     * Sets the {@link ObjectPool} in which to pool {@link Connection}s.
-     *
-     * @param pool
-     *            the {@link ObjectPool} in which to pool those {@link Connection}s
+     * @return The cache state.
+     * @since Made public in 2.6.0.
      */
-    public synchronized void setPool(final ObjectPool<PoolableConnection> pool) {
-        if (null != this.pool && pool != this.pool) {
-            try {
-                this.pool.close();
-            } catch (final Exception e) {
-                // ignored !?!
-            }
-        }
-        this.pool = pool;
+    public boolean getCacheState() {
+        return cacheState;
     }
 
     /**
-     * Returns the {@link ObjectPool} in which {@link Connection}s are pooled.
-     *
-     * @return the connection pool
+     * @return The connection factory.
+     * @since Made public in 2.6.0.
      */
-    public synchronized ObjectPool<PoolableConnection> getPool() {
-        return pool;
+    public ConnectionFactory getConnectionFactory() {
+        return connectionFactory;
     }
 
-    /**
-     * Sets the default "read only" setting for borrowed {@link Connection}s
-     *
-     * @param defaultReadOnly
-     *            the default "read only" setting for borrowed {@link Connection}s
-     */
-    public void setDefaultReadOnly(final Boolean defaultReadOnly) {
-        this.defaultReadOnly = defaultReadOnly;
+    protected AtomicLong getConnectionIndex() {
+        return connectionIndex;
     }
 
     /**
-     * Sets the default "auto commit" setting for borrowed {@link Connection}s
-     *
-     * @param defaultAutoCommit
-     *            the default "auto commit" setting for borrowed {@link Connection}s
+     * @return The collection of initialization SQL statements.
+     * @since 2.6.0
      */
-    public void setDefaultAutoCommit(final Boolean defaultAutoCommit) {
-        this.defaultAutoCommit = defaultAutoCommit;
+    public Collection<String> getConnectionInitSqls() {
+        return connectionInitSqls;
     }
 
     /**
-     * Sets the default "Transaction Isolation" setting for borrowed {@link Connection}s
-     *
-     * @param defaultTransactionIsolation
-     *            the default "Transaction Isolation" setting for returned {@link Connection}s
+     * @return The data source JMX ObjectName
+     * @since Made public in 2.6.0.
      */
-    public void setDefaultTransactionIsolation(final int defaultTransactionIsolation) {
-        this.defaultTransactionIsolation = defaultTransactionIsolation;
+    public ObjectName getDataSourceJmxName() {
+        return dataSourceJmxObjectName;
     }
 
     /**
-     * Sets the default "catalog" setting for borrowed {@link Connection}s
-     *
-     * @param defaultCatalog
-     *            the default "catalog" setting for borrowed {@link Connection}s
+     * @return The data source JMS ObjectName.
+     * @since 2.6.0
      */
-    public void setDefaultCatalog(final String defaultCatalog) {
-        this.defaultCatalog = defaultCatalog;
+    public ObjectName getDataSourceJmxObjectName() {
+        return dataSourceJmxObjectName;
     }
 
     /**
-     * Sets the default "schema" setting for borrowed {@link Connection}s
-     *
-     * @param defaultSchema
-     *            the default "schema" setting for borrowed {@link Connection}s
-     * @since 2.5.0
+     * @return Default auto-commit value.
+     * @since 2.6.0
      */
-    public void setDefaultSchema(final String defaultSchema) {
-        this.defaultSchema = defaultSchema;
-    }
-
-    public void setCacheState(final boolean cacheState) {
-        this.cacheState = cacheState;
-    }
-
-    public void setPoolStatements(final boolean poolStatements) {
-        this.poolStatements = poolStatements;
+    public Boolean getDefaultAutoCommit() {
+        return defaultAutoCommit;
     }
 
     /**
-     * Deprecated due to typo in method name.
-     *
-     * @param maxOpenPreparedStatements
-     *            The maximum number of open prepared statements.
-     * @deprecated Use {@link #setMaxOpenPreparedStatements(int)}.
+     * @return Default catalog.
+     * @since 2.6.0
      */
-    @Deprecated // Due to typo in method name.
-    public void setMaxOpenPrepatedStatements(final int maxOpenPreparedStatements) {
-        setMaxOpenPreparedStatements(maxOpenPreparedStatements);
+    public String getDefaultCatalog() {
+        return defaultCatalog;
     }
 
     /**
-     * Sets the maximum number of open prepared statements.
-     *
-     * @param maxOpenPreparedStatements
-     *            The maximum number of open prepared statements.
+     * @return Default query timeout in seconds.
      */
-    public void setMaxOpenPreparedStatements(final int maxOpenPreparedStatements) {
-        this.maxOpenPreparedStatements = maxOpenPreparedStatements;
+    public Integer getDefaultQueryTimeout() {
+        return defaultQueryTimeoutSeconds;
     }
 
     /**
-     * Sets the maximum lifetime in milliseconds of a connection after which the connection will always fail activation,
-     * passivation and validation. A value of zero or less indicates an infinite lifetime. The default value is -1.
-     *
-     * @param maxConnLifetimeMillis
-     *            The maximum lifetime in milliseconds.
+     * @return Default query timeout in seconds.
+     * @since 2.6.0
      */
-    public void setMaxConnLifetimeMillis(final long maxConnLifetimeMillis) {
-        this.maxConnLifetimeMillis = maxConnLifetimeMillis;
+    public Integer getDefaultQueryTimeoutSeconds() {
+        return defaultQueryTimeoutSeconds;
     }
 
     /**
-     * @deprecated Use {@link #isAutoCommitOnReturn()}.
+     * @return Default read-only-value.
+     * @since 2.6.0
      */
-    @Deprecated
-    public boolean isEnableAutoCommitOnReturn() {
-        return autoCommitOnReturn;
+    public Boolean getDefaultReadOnly() {
+        return defaultReadOnly;
     }
 
     /**
+     * @return Default schema.
      * @since 2.6.0
      */
-    public boolean isAutoCommitOnReturn() {
-        return autoCommitOnReturn;
-    }
-
-    public void setAutoCommitOnReturn(final boolean autoCommitOnReturn) {
-        this.autoCommitOnReturn = autoCommitOnReturn;
+    public String getDefaultSchema() {
+        return defaultSchema;
     }
 
     /**
-     * @deprecated Use {@link setAutoCommitOnReturn(boolean)}.
+     * @return Default transaction isolation.
+     * @since 2.6.0
      */
-    @Deprecated
-    public void setEnableAutoCommitOnReturn(final boolean autoCommitOnReturn) {
-        this.autoCommitOnReturn = autoCommitOnReturn;
-    }
-
-    public boolean isRollbackOnReturn() {
-        return rollbackOnReturn;
-    }
-
-    public void setRollbackOnReturn(final boolean rollbackOnReturn) {
-        this.rollbackOnReturn = rollbackOnReturn;
-    }
-
-    public Integer getDefaultQueryTimeout() {
-        return defaultQueryTimeoutSeconds;
-    }
-
-    public void setDefaultQueryTimeout(final Integer defaultQueryTimeoutSeconds) {
-        this.defaultQueryTimeoutSeconds = defaultQueryTimeoutSeconds;
+    public int getDefaultTransactionIsolation() {
+        return defaultTransactionIsolation;
     }
 
     /**
@@ -273,15 +257,79 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
     }
 
     /**
-     * @param disconnectionSqlCodes
-     *            The disconnection SQL codes.
-     * @see #getDisconnectionSqlCodes()
-     * @since 2.1
+     * @return Maximum connection lifetime in milliseconds.
+     * @since 2.6.0
      */
-    public void setDisconnectionSqlCodes(final Collection<String> disconnectionSqlCodes) {
-        this.disconnectionSqlCodes = disconnectionSqlCodes;
+    public long getMaxConnLifetimeMillis() {
+        return maxConnLifetimeMillis;
     }
 
+    protected int getMaxOpenPreparedStatements() {
+        return maxOpenPreparedStatements;
+    }
+
+    /**
+     * Returns the {@link ObjectPool} in which {@link Connection}s are pooled.
+     *
+     * @return the connection pool
+     */
+    public synchronized ObjectPool<PoolableConnection> getPool() {
+        return pool;
+    }
+
+    /**
+     * @return Whether to pool statements.
+     * @since Made public in 2.6.0.
+     */
+    public boolean getPoolStatements() {
+        return poolStatements;
+    }
+    /**
+     * @return Validation query.
+     * @since 2.6.0
+     */
+    public String getValidationQuery() {
+        return validationQuery;
+    }
+    /**
+     * @return Validation query timeout in seconds.
+     * @since 2.6.0
+     */
+    public int getValidationQueryTimeoutSeconds() {
+        return validationQueryTimeoutSeconds;
+    }
+    protected void initializeConnection(final Connection conn) throws SQLException {
+        final Collection<String> sqls = connectionInitSqls;
+        if (conn.isClosed()) {
+            throw new SQLException("initializeConnection: connection closed");
+        }
+        if (null != sqls) {
+            try (Statement stmt = conn.createStatement()) {
+                for (final String sql : sqls) {
+                    Objects.requireNonNull(sql, "null connectionInitSqls element");
+                    stmt.execute(sql);
+                }
+            }
+        }
+    }
+    
+    /**
+     * @return Whether to auto-commit on return.
+     * @since 2.6.0
+     */
+    public boolean isAutoCommitOnReturn() {
+        return autoCommitOnReturn;
+    }
+
+    /**
+     * @return Whether to auto-commit on return.
+     * @deprecated Use {@link #isAutoCommitOnReturn()}.
+     */
+    @Deprecated
+    public boolean isEnableAutoCommitOnReturn() {
+        return autoCommitOnReturn;
+    }
+    
     /**
      * True means that validation will fail immediately for connections that have previously thrown SQLExceptions with
      * SQL_STATE indicating fatal disconnection errors.
@@ -294,17 +342,14 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
     public boolean isFastFailValidation() {
         return fastFailValidation;
     }
-
+    
     /**
-     * @see #isFastFailValidation()
-     * @param fastFailValidation
-     *            true means connections created by this factory will fast fail validation
-     * @since 2.1
+     * @return Whether to rollback on return.
      */
-    public void setFastFailValidation(final boolean fastFailValidation) {
-        this.fastFailValidation = fastFailValidation;
+    public boolean isRollbackOnReturn() {
+        return rollbackOnReturn;
     }
-
+    
     @Override
     public PooledObject<PoolableConnection> makeObject() throws Exception {
         Connection conn = connectionFactory.createConnection();
@@ -365,49 +410,7 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
 
         return new DefaultPooledObject<>(pc);
     }
-
-    protected void initializeConnection(final Connection conn) throws SQLException {
-        final Collection<String> sqls = connectionInitSqls;
-        if (conn.isClosed()) {
-            throw new SQLException("initializeConnection: connection closed");
-        }
-        if (null != sqls) {
-            try (Statement stmt = conn.createStatement()) {
-                for (final String sql : sqls) {
-                    Objects.requireNonNull(sql, "null connectionInitSqls element");
-                    stmt.execute(sql);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void destroyObject(final PooledObject<PoolableConnection> p) throws Exception {
-        p.getObject().reallyClose();
-    }
-
-    @Override
-    public boolean validateObject(final PooledObject<PoolableConnection> p) {
-        try {
-            validateLifetime(p);
-
-            validateConnection(p.getObject());
-            return true;
-        } catch (final Exception e) {
-            if (log.isDebugEnabled()) {
-                log.debug(Utils.getMessage("poolableConnectionFactory.validateObject.fail"), e);
-            }
-            return false;
-        }
-    }
-
-    public void validateConnection(final PoolableConnection conn) throws SQLException {
-        if (conn.isClosed()) {
-            throw new SQLException("validateConnection: connection closed");
-        }
-        conn.validate(validationQuery, validationQueryTimeoutSeconds);
-    }
-
+    
     @Override
     public void passivateObject(final PooledObject<PoolableConnection> p) throws Exception {
 
@@ -437,181 +440,218 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
 
         conn.passivate();
     }
-
-    @Override
-    public void activateObject(final PooledObject<PoolableConnection> p) throws Exception {
-
-        validateLifetime(p);
-
-        final PoolableConnection conn = p.getObject();
-        conn.activate();
-
-        if (defaultAutoCommit != null && conn.getAutoCommit() != defaultAutoCommit.booleanValue()) {
-            conn.setAutoCommit(defaultAutoCommit.booleanValue());
-        }
-        if (defaultTransactionIsolation != UNKNOWN_TRANSACTION_ISOLATION
-                && conn.getTransactionIsolation() != defaultTransactionIsolation) {
-            conn.setTransactionIsolation(defaultTransactionIsolation);
-        }
-        if (defaultReadOnly != null && conn.isReadOnly() != defaultReadOnly.booleanValue()) {
-            conn.setReadOnly(defaultReadOnly.booleanValue());
-        }
-        if (defaultCatalog != null && !defaultCatalog.equals(conn.getCatalog())) {
-            conn.setCatalog(defaultCatalog);
-        }
-        if (defaultSchema != null && !defaultSchema.equals(Jdbc41Bridge.getSchema(conn))) {
-            Jdbc41Bridge.setSchema(conn, defaultSchema);
-        }
-        conn.setDefaultQueryTimeout(defaultQueryTimeoutSeconds);
+    
+    public void setAutoCommitOnReturn(final boolean autoCommitOnReturn) {
+        this.autoCommitOnReturn = autoCommitOnReturn;
     }
-
-    private void validateLifetime(final PooledObject<PoolableConnection> p) throws Exception {
-        if (maxConnLifetimeMillis > 0) {
-            final long lifetime = System.currentTimeMillis() - p.getCreateTime();
-            if (lifetime > maxConnLifetimeMillis) {
-                throw new LifetimeExceededException(Utils.getMessage("connectionFactory.lifetimeExceeded",
-                        Long.valueOf(lifetime), Long.valueOf(maxConnLifetimeMillis)));
-            }
-        }
+    
+    public void setCacheState(final boolean cacheState) {
+        this.cacheState = cacheState;
     }
-
+    
     /**
-     * @since Made public in 2.6.0.
+     * Sets the SQL statements I use to initialize newly created {@link Connection}s. Using {@code null} turns off
+     * connection initialization.
+     *
+     * @param connectionInitSqls
+     *            SQL statement to initialize {@link Connection}s.
      */
-    public ConnectionFactory getConnectionFactory() {
-        return connectionFactory;
+    public void setConnectionInitSql(final Collection<String> connectionInitSqls) {
+        this.connectionInitSqls = connectionInitSqls;
     }
-
+    
     /**
-     * @since Made public in 2.6.0.
+     * Sets the default "auto commit" setting for borrowed {@link Connection}s
+     *
+     * @param defaultAutoCommit
+     *            the default "auto commit" setting for borrowed {@link Connection}s
      */
-    public boolean getPoolStatements() {
-        return poolStatements;
-    }
-
-    protected int getMaxOpenPreparedStatements() {
-        return maxOpenPreparedStatements;
+    public void setDefaultAutoCommit(final Boolean defaultAutoCommit) {
+        this.defaultAutoCommit = defaultAutoCommit;
     }
-
+    
     /**
-     * @since Made public in 2.6.0.
+     * Sets the default "catalog" setting for borrowed {@link Connection}s
+     *
+     * @param defaultCatalog
+     *            the default "catalog" setting for borrowed {@link Connection}s
      */
-    public boolean getCacheState() {
-        return cacheState;
+    public void setDefaultCatalog(final String defaultCatalog) {
+        this.defaultCatalog = defaultCatalog;
+    }
+    
+    public void setDefaultQueryTimeout(final Integer defaultQueryTimeoutSeconds) {
+        this.defaultQueryTimeoutSeconds = defaultQueryTimeoutSeconds;
     }
-
     /**
-     * @since Made public in 2.6.0.
+     * Sets the default "read only" setting for borrowed {@link Connection}s
+     *
+     * @param defaultReadOnly
+     *            the default "read only" setting for borrowed {@link Connection}s
      */
-    public ObjectName getDataSourceJmxName() {
-        return dataSourceJmxObjectName;
-    }
-
-    protected AtomicLong getConnectionIndex() {
-        return connectionIndex;
+    public void setDefaultReadOnly(final Boolean defaultReadOnly) {
+        this.defaultReadOnly = defaultReadOnly;
     }
-
-    private final ConnectionFactory connectionFactory;
-    private final ObjectName dataSourceJmxObjectName;
-    private volatile String validationQuery;
-    private volatile int validationQueryTimeoutSeconds = -1;
-    private Collection<String> connectionInitSqls;
-    private Collection<String> disconnectionSqlCodes;
-    private boolean fastFailValidation = true;
-    private volatile ObjectPool<PoolableConnection> pool;
-    private Boolean defaultReadOnly;
-    private Boolean defaultAutoCommit;
-    private boolean autoCommitOnReturn = true;
-    private boolean rollbackOnReturn = true;
-    private int defaultTransactionIsolation = UNKNOWN_TRANSACTION_ISOLATION;
-    private String defaultCatalog;
-    private String defaultSchema;
-    private boolean cacheState;
-    private boolean poolStatements;
-    private int maxOpenPreparedStatements = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
-    private long maxConnLifetimeMillis = -1;
-    private final AtomicLong connectionIndex = new AtomicLong(0);
-    private Integer defaultQueryTimeoutSeconds;
-
+    
     /**
-     * Internal constant to indicate the level is not set.
+     * Sets the default "schema" setting for borrowed {@link Connection}s
+     *
+     * @param defaultSchema
+     *            the default "schema" setting for borrowed {@link Connection}s
+     * @since 2.5.0
      */
-    static final int UNKNOWN_TRANSACTION_ISOLATION = -1;
-
+    public void setDefaultSchema(final String defaultSchema) {
+        this.defaultSchema = defaultSchema;
+    }
+    
     /**
-     * @since 2.6.0
+     * Sets the default "Transaction Isolation" setting for borrowed {@link Connection}s
+     *
+     * @param defaultTransactionIsolation
+     *            the default "Transaction Isolation" setting for returned {@link Connection}s
      */
-    public ObjectName getDataSourceJmxObjectName() {
-        return dataSourceJmxObjectName;
+    public void setDefaultTransactionIsolation(final int defaultTransactionIsolation) {
+        this.defaultTransactionIsolation = defaultTransactionIsolation;
     }
-
+    
     /**
-     * @since 2.6.0
+     * @param disconnectionSqlCodes
+     *            The disconnection SQL codes.
+     * @see #getDisconnectionSqlCodes()
+     * @since 2.1
      */
-    public String getValidationQuery() {
-        return validationQuery;
+    public void setDisconnectionSqlCodes(final Collection<String> disconnectionSqlCodes) {
+        this.disconnectionSqlCodes = disconnectionSqlCodes;
     }
-
+    
     /**
-     * @since 2.6.0
+     * @param autoCommitOnReturn Whether to auto-commit on return.
+     * @deprecated Use {@link #setAutoCommitOnReturn(boolean)}.
      */
-    public int getValidationQueryTimeoutSeconds() {
-        return validationQueryTimeoutSeconds;
+    @Deprecated
+    public void setEnableAutoCommitOnReturn(final boolean autoCommitOnReturn) {
+        this.autoCommitOnReturn = autoCommitOnReturn;
     }
 
     /**
-     * @since 2.6.0
+     * @see #isFastFailValidation()
+     * @param fastFailValidation
+     *            true means connections created by this factory will fast fail validation
+     * @since 2.1
      */
-    public Collection<String> getConnectionInitSqls() {
-        return connectionInitSqls;
+    public void setFastFailValidation(final boolean fastFailValidation) {
+        this.fastFailValidation = fastFailValidation;
     }
 
     /**
-     * @since 2.6.0
+     * Sets the maximum lifetime in milliseconds of a connection after which the connection will always fail activation,
+     * passivation and validation. A value of zero or less indicates an infinite lifetime. The default value is -1.
+     *
+     * @param maxConnLifetimeMillis
+     *            The maximum lifetime in milliseconds.
      */
-    public Boolean getDefaultReadOnly() {
-        return defaultReadOnly;
+    public void setMaxConnLifetimeMillis(final long maxConnLifetimeMillis) {
+        this.maxConnLifetimeMillis = maxConnLifetimeMillis;
     }
 
     /**
-     * @since 2.6.0
+     * Sets the maximum number of open prepared statements.
+     *
+     * @param maxOpenPreparedStatements
+     *            The maximum number of open prepared statements.
      */
-    public Boolean getDefaultAutoCommit() {
-        return defaultAutoCommit;
+    public void setMaxOpenPreparedStatements(final int maxOpenPreparedStatements) {
+        this.maxOpenPreparedStatements = maxOpenPreparedStatements;
     }
 
     /**
-     * @since 2.6.0
+     * Deprecated due to typo in method name.
+     *
+     * @param maxOpenPreparedStatements
+     *            The maximum number of open prepared statements.
+     * @deprecated Use {@link #setMaxOpenPreparedStatements(int)}.
      */
-    public int getDefaultTransactionIsolation() {
-        return defaultTransactionIsolation;
+    @Deprecated // Due to typo in method name.
+    public void setMaxOpenPrepatedStatements(final int maxOpenPreparedStatements) {
+        setMaxOpenPreparedStatements(maxOpenPreparedStatements);
     }
 
     /**
-     * @since 2.6.0
+     * Sets the {@link ObjectPool} in which to pool {@link Connection}s.
+     *
+     * @param pool
+     *            the {@link ObjectPool} in which to pool those {@link Connection}s
      */
-    public String getDefaultCatalog() {
-        return defaultCatalog;
+    public synchronized void setPool(final ObjectPool<PoolableConnection> pool) {
+        if (null != this.pool && pool != this.pool) {
+            try {
+                this.pool.close();
+            } catch (final Exception e) {
+                // ignored !?!
+            }
+        }
+        this.pool = pool;
     }
 
-    /**
-     * @since 2.6.0
-     */
-    public String getDefaultSchema() {
-        return defaultSchema;
+    public void setPoolStatements(final boolean poolStatements) {
+        this.poolStatements = poolStatements;
+    }
+
+    public void setRollbackOnReturn(final boolean rollbackOnReturn) {
+        this.rollbackOnReturn = rollbackOnReturn;
     }
 
     /**
-     * @since 2.6.0
+     * Sets the query I use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. If
+     * not specified, {@link Connection#isValid(int)} will be used to validate connections.
+     *
+     * @param validationQuery
+     *            a query to use to {@link #validateObject validate} {@link Connection}s.
      */
-    public long getMaxConnLifetimeMillis() {
-        return maxConnLifetimeMillis;
+    public void setValidationQuery(final String validationQuery) {
+        this.validationQuery = validationQuery;
     }
 
     /**
-     * @since 2.6.0
+     * Sets the validation query timeout, the amount of time, in seconds, that connection validation will wait for a
+     * response from the database when executing a validation query. Use a value less than or equal to 0 for no timeout.
+     *
+     * @param validationQueryTimeoutSeconds
+     *            new validation query timeout value in seconds
      */
-    public Integer getDefaultQueryTimeoutSeconds() {
-        return defaultQueryTimeoutSeconds;
+    public void setValidationQueryTimeout(final int validationQueryTimeoutSeconds) {
+        this.validationQueryTimeoutSeconds = validationQueryTimeoutSeconds;
+    }
+
+    public void validateConnection(final PoolableConnection conn) throws SQLException {
+        if (conn.isClosed()) {
+            throw new SQLException("validateConnection: connection closed");
+        }
+        conn.validate(validationQuery, validationQueryTimeoutSeconds);
+    }
+
+    private void validateLifetime(final PooledObject<PoolableConnection> p) throws Exception {
+        if (maxConnLifetimeMillis > 0) {
+            final long lifetime = System.currentTimeMillis() - p.getCreateTime();
+            if (lifetime > maxConnLifetimeMillis) {
+                throw new LifetimeExceededException(Utils.getMessage("connectionFactory.lifetimeExceeded",
+                        Long.valueOf(lifetime), Long.valueOf(maxConnLifetimeMillis)));
+            }
+        }
+    }
+
+    @Override
+    public boolean validateObject(final PooledObject<PoolableConnection> p) {
+        try {
+            validateLifetime(p);
+
+            validateConnection(p.getObject());
+            return true;
+        } catch (final Exception e) {
+            if (log.isDebugEnabled()) {
+                log.debug(Utils.getMessage("poolableConnectionFactory.validateObject.fail"), e);
+            }
+            return false;
+        }
     }
 }
index 990aab1..f0c454d 100644 (file)
@@ -336,6 +336,7 @@ public class LocalXAConnectionFactory implements XAConnectionFactory {
     }
 
     /**
+     * @return The connection factory.
      * @since 2.6.0
      */
     public ConnectionFactory getConnectionFactory() {
index 7c074e6..351fe87 100644 (file)
@@ -149,6 +149,7 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio
     }
 
     /**
+     * @return The transaction context.
      * @since 2.6.0
      */
     public TransactionContext getTransactionContext() {
@@ -156,6 +157,7 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio
     }
 
     /**
+     * @return The transaction registry.
      * @since 2.6.0
      */
     public TransactionRegistry getTransactionRegistry() {
index 5055e61..f6c0acf 100644 (file)
@@ -71,6 +71,7 @@ public class PoolableManagedConnection extends PoolableConnection {
     }
 
     /**
+     * @return The transaction registry.
      * @since 2.6.0
      */
     public TransactionRegistry getTransactionRegistry() {
index e62b65d..de730e5 100644 (file)
@@ -57,6 +57,7 @@ public class PoolableManagedConnectionFactory extends PoolableConnectionFactory
     }
 
     /**
+     * @return The transaction registry.
      * @since 2.6.0
      */
     public TransactionRegistry getTransactionRegistry() {