Class InstanceKeyDataSource

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.AutoCloseable, java.sql.Wrapper, javax.naming.Referenceable, javax.sql.CommonDataSource, javax.sql.DataSource
    Direct Known Subclasses:
    PerUserPoolDataSource, SharedPoolDataSource

    public abstract class InstanceKeyDataSource
    extends java.lang.Object
    implements javax.sql.DataSource, javax.naming.Referenceable, java.io.Serializable, java.lang.AutoCloseable

    The base class for SharedPoolDataSource and PerUserPoolDataSource. 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 commons-dbcp2.

    A J2EE container will normally provide some method of initializing the DataSource 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 ConnectionPoolDataSource that can be specified via the setDataSourceName(String) used to lookup the source via JNDI.

    Although normally used within a JNDI environment, A DataSource can be instantiated and initialized as any bean. In this case the ConnectionPoolDataSource 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 setConnectionPoolDataSource(ConnectionPoolDataSource) method.

    The dbcp package contains an adapter, DriverAdapterCPDS, that can be used to allow the use of DataSource's based on this class with JDBC driver implementations that do not supply a ConnectionPoolDataSource, but still provide a Driver implementation.

    The package documentation contains an example using Apache Tomcat and JNDI and it also contains a non-JNDI example.

    Since:
    2.0
    See Also:
    Serialized Form
    • Field Detail

      • UNKNOWN_TRANSACTIONISOLATION

        protected static final int UNKNOWN_TRANSACTIONISOLATION
        Internal constant to indicate the level is not set.
        See Also:
        Constant Field Values
    • Constructor Detail

      • InstanceKeyDataSource

        public InstanceKeyDataSource()
        Default no-arg constructor for Serialization.
    • Method Detail

      • assertInitializationAllowed

        protected void assertInitializationAllowed()
                                            throws java.lang.IllegalStateException
        Throws an IllegalStateException, if a PooledConnection has already been requested.
        Throws:
        java.lang.IllegalStateException - Thrown if a PooledConnection has already been requested.
      • close

        public abstract void close()
                            throws java.lang.Exception
        Closes the connection pool being maintained by this datasource.
        Specified by:
        close in interface java.lang.AutoCloseable
        Throws:
        java.lang.Exception
      • getConnection

        public java.sql.Connection getConnection()
                                          throws java.sql.SQLException
        Attempts to establish a database connection.
        Specified by:
        getConnection in interface javax.sql.DataSource
        Throws:
        java.sql.SQLException
      • getConnection

        public java.sql.Connection getConnection​(java.lang.String userName,
                                                 java.lang.String userPassword)
                                          throws java.sql.SQLException
        Attempts to retrieve a database connection using getPooledConnectionAndInfo(String, String) with the provided user name and password. The password on the PooledConnectionAndInfo instance returned by getPooledConnectionAndInfo is compared to the password 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 PooledConnectionAndInfo instance retrieved with the old password is destroyed and the getPooledConnectionAndInfo is repeatedly invoked until a PooledConnectionAndInfo instance with the new password is returned.
        Specified by:
        getConnection in interface javax.sql.DataSource
        Throws:
        java.sql.SQLException
      • getConnectionManager

        protected abstract org.apache.tomcat.dbcp.dbcp2.datasources.PooledConnectionManager getConnectionManager​(org.apache.tomcat.dbcp.dbcp2.datasources.UserPassKey upkey)
      • getConnectionPoolDataSource

        public javax.sql.ConnectionPoolDataSource getConnectionPoolDataSource()
        Gets the value of connectionPoolDataSource. This method will return null, if the backing data source is being accessed via JNDI.
        Returns:
        value of connectionPoolDataSource.
      • getDataSourceName

        public java.lang.String getDataSourceName()
        Gets the name of the ConnectionPoolDataSource which backs this pool. This name is used to look up the data source from a JNDI service provider.
        Returns:
        value of dataSourceName.
      • getDefaultTimeBetweenEvictionRunsMillis

        @Deprecated
        public long getDefaultTimeBetweenEvictionRunsMillis()
        Gets the default value for () for each per user pool.
        Returns:
        The default value for () for each per user pool.
      • getDefaultTransactionIsolation

        public int getDefaultTransactionIsolation()
        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.
        Returns:
        value of defaultTransactionIsolation.
      • getDescription

        public java.lang.String getDescription()
        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.
        Returns:
        value of description.
      • getInstanceKey

        protected java.lang.String getInstanceKey()
        Gets the instance key.
        Returns:
        the instance key.
      • getJndiEnvironment

        public java.lang.String getJndiEnvironment​(java.lang.String key)
        Gets the value of jndiEnvironment which is used when instantiating a JNDI InitialContext. This InitialContext is used to locate the back end ConnectionPoolDataSource.
        Parameters:
        key - JNDI environment key.
        Returns:
        value of jndiEnvironment.
      • getLoginTimeout

        @Deprecated
        public int getLoginTimeout()
        Deprecated.
        Gets the value of loginTimeout.
        Specified by:
        getLoginTimeout in interface javax.sql.CommonDataSource
        Specified by:
        getLoginTimeout in interface javax.sql.DataSource
        Returns:
        value of loginTimeout.
      • getLoginTimeoutDuration

        public java.time.Duration getLoginTimeoutDuration()
        Gets the value of loginTimeout.
        Returns:
        value of loginTimeout.
        Since:
        2.10.0
      • getLogWriter

        public java.io.PrintWriter getLogWriter()
        Gets the value of logWriter.
        Specified by:
        getLogWriter in interface javax.sql.CommonDataSource
        Specified by:
        getLogWriter in interface javax.sql.DataSource
        Returns:
        value of logWriter.
      • getMaxConnDuration

        public java.time.Duration getMaxConnDuration()
        Gets the maximum permitted lifetime of a connection. A value of zero or less indicates an infinite lifetime.
        Returns:
        The maximum permitted lifetime of a connection. A value of zero or less indicates an infinite lifetime.
        Since:
        2.10.0
      • getMaxConnLifetime

        @Deprecated
        public java.time.Duration getMaxConnLifetime()
        Deprecated.
        Gets the maximum permitted lifetime of a connection. A value of zero or less indicates an infinite lifetime.
        Returns:
        The maximum permitted lifetime of a connection. A value of zero or less indicates an infinite lifetime.
      • getMaxConnLifetimeMillis

        @Deprecated
        public long getMaxConnLifetimeMillis()
        Deprecated.
        Gets 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.
      • getParentLogger

        public java.util.logging.Logger getParentLogger()
                                                 throws java.sql.SQLFeatureNotSupportedException
        Specified by:
        getParentLogger in interface javax.sql.CommonDataSource
        Throws:
        java.sql.SQLFeatureNotSupportedException
      • getPooledConnectionAndInfo

        protected abstract org.apache.tomcat.dbcp.dbcp2.datasources.PooledConnectionAndInfo getPooledConnectionAndInfo​(java.lang.String userName,
                                                                                                                       java.lang.String userPassword)
                                                                                                                throws java.sql.SQLException
        This method is protected but can only be implemented in this package because PooledConnectionAndInfo is a package private type.
        Parameters:
        userName - The user name.
        userPassword - The user password.
        Returns:
        Matching PooledConnectionAndInfo.
        Throws:
        java.sql.SQLException - Connection or registration failure.
      • getValidationQuery

        public java.lang.String getValidationQuery()
        Gets the SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row. If not specified, Connection.isValid(int) will be used to validate connections.
        Returns:
        The SQL query that will be used to validate connections from this pool before returning them to the caller.
      • getValidationQueryTimeout

        @Deprecated
        public int getValidationQueryTimeout()
        Returns the timeout in seconds before the validation query fails.
        Returns:
        The timeout in seconds before the validation query fails.
      • getValidationQueryTimeoutDuration

        public java.time.Duration getValidationQueryTimeoutDuration()
        Returns the timeout Duration before the validation query fails.
        Returns:
        The timeout Duration before the validation query fails.
      • isDefaultAutoCommit

        public java.lang.Boolean isDefaultAutoCommit()
        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 null which will use the default value for the drive.
        Returns:
        value of defaultAutoCommit.
      • isDefaultReadOnly

        public java.lang.Boolean isDefaultReadOnly()
        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 null which will use the default value for the drive.
        Returns:
        value of defaultReadOnly.
      • isRollbackAfterValidation

        public boolean isRollbackAfterValidation()
        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.
        Returns:
        true if a rollback will be issued after executing the validation query
      • isWrapperFor

        public boolean isWrapperFor​(java.lang.Class<?> iface)
                             throws java.sql.SQLException
        Specified by:
        isWrapperFor in interface java.sql.Wrapper
        Throws:
        java.sql.SQLException
      • setConnectionPoolDataSource

        public void setConnectionPoolDataSource​(javax.sql.ConnectionPoolDataSource dataSource)
        Sets the back end ConnectionPoolDataSource. This property should not be set if using JNDI to access the data source.
        Parameters:
        dataSource - Value to assign to connectionPoolDataSource.
      • setDataSourceName

        public void setDataSourceName​(java.lang.String dataSourceName)
        Sets the name of the ConnectionPoolDataSource which backs this pool. This name is used to look up the data source from a JNDI service provider.
        Parameters:
        dataSourceName - Value to assign to dataSourceName.
      • setDefaultAutoCommit

        public void setDefaultAutoCommit​(java.lang.Boolean defaultAutoCommit)
        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 null which will use the default value for the drive.
        Parameters:
        defaultAutoCommit - Value to assign to defaultAutoCommit.
      • setDefaultDurationBetweenEvictionRuns

        public void setDefaultDurationBetweenEvictionRuns​(java.time.Duration defaultDurationBetweenEvictionRuns)
        Sets the default value for () for each per user pool.
        Parameters:
        defaultDurationBetweenEvictionRuns - The default value for () for each per user pool.
        Since:
        2.10.0
      • setDefaultReadOnly

        public void setDefaultReadOnly​(java.lang.Boolean defaultReadOnly)
        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 null which will use the default value for the drive.
        Parameters:
        defaultReadOnly - Value to assign to defaultReadOnly.
      • setDefaultTransactionIsolation

        public void setDefaultTransactionIsolation​(int defaultTransactionIsolation)
        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.
        Parameters:
        defaultTransactionIsolation - Value to assign to defaultTransactionIsolation
      • setDescription

        public void setDescription​(java.lang.String description)
        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.
        Parameters:
        description - Value to assign to description.
      • setJndiEnvironment

        public void setJndiEnvironment​(java.lang.String key,
                                       java.lang.String value)
        Sets the value of the given JNDI environment property to be used when instantiating a JNDI InitialContext. This InitialContext is used to locate the back end ConnectionPoolDataSource.
        Parameters:
        key - the JNDI environment property to set.
        value - the value assigned to specified JNDI environment property.
      • setLoginTimeout

        public void setLoginTimeout​(java.time.Duration loginTimeout)
        Sets the value of loginTimeout.
        Parameters:
        loginTimeout - Value to assign to loginTimeout.
        Since:
        2.10.0
      • setLoginTimeout

        @Deprecated
        public void setLoginTimeout​(int loginTimeout)
        Deprecated.
        Sets the value of loginTimeout.
        Specified by:
        setLoginTimeout in interface javax.sql.CommonDataSource
        Specified by:
        setLoginTimeout in interface javax.sql.DataSource
        Parameters:
        loginTimeout - Value to assign to loginTimeout.
      • setLogWriter

        public void setLogWriter​(java.io.PrintWriter logWriter)
        Sets the value of logWriter.
        Specified by:
        setLogWriter in interface javax.sql.CommonDataSource
        Specified by:
        setLogWriter in interface javax.sql.DataSource
        Parameters:
        logWriter - Value to assign to logWriter.
      • setMaxConnLifetime

        public void setMaxConnLifetime​(java.time.Duration maxConnLifetimeMillis)

        Sets the maximum permitted lifetime of a connection. A value of zero or less indicates an infinite lifetime.

        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: getConnection, setLogwriter, setLoginTimeout, getLoginTimeout, getLogWriter.

        Parameters:
        maxConnLifetimeMillis - The maximum permitted lifetime of a connection. A value of zero or less indicates an infinite lifetime.
        Since:
        2.9.0
      • setMaxConnLifetimeMillis

        @Deprecated
        public void setMaxConnLifetimeMillis​(long maxConnLifetimeMillis)

        Sets the maximum permitted lifetime of a connection in milliseconds. A value of zero or less indicates an infinite lifetime.

        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: getConnection, setLogwriter, setLoginTimeout, getLoginTimeout, getLogWriter.

        Parameters:
        maxConnLifetimeMillis - The maximum permitted lifetime of a connection in milliseconds. A value of zero or less indicates an infinite lifetime.
      • setRollbackAfterValidation

        public void setRollbackAfterValidation​(boolean 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
        Parameters:
        rollbackAfterValidation - new property value
      • setupDefaults

        protected abstract void setupDefaults​(java.sql.Connection connection,
                                              java.lang.String userName)
                                       throws java.sql.SQLException
        Throws:
        java.sql.SQLException
      • setValidationQuery

        public void setValidationQuery​(java.lang.String validationQuery)
        Sets the SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row. If not specified, connections will be validated using Connection.isValid(int).
        Parameters:
        validationQuery - The SQL query that will be used to validate connections from this pool before returning them to the caller.
      • setValidationQueryTimeout

        public void setValidationQueryTimeout​(java.time.Duration validationQueryTimeoutDuration)
        Sets the timeout duration before the validation query fails.
        Parameters:
        validationQueryTimeoutDuration - The new timeout duration.
      • setValidationQueryTimeout

        @Deprecated
        public void setValidationQueryTimeout​(int validationQueryTimeoutSeconds)
        Sets the timeout in seconds before the validation query fails.
        Parameters:
        validationQueryTimeoutSeconds - The new timeout in seconds
      • testCPDS

        protected javax.sql.ConnectionPoolDataSource testCPDS​(java.lang.String userName,
                                                              java.lang.String userPassword)
                                                       throws javax.naming.NamingException,
                                                              java.sql.SQLException
        Throws:
        javax.naming.NamingException
        java.sql.SQLException
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
        Since:
        2.6.0
      • toStringFields

        protected void toStringFields​(java.lang.StringBuilder builder)
      • unwrap

        public <T> T unwrap​(java.lang.Class<T> iface)
                     throws java.sql.SQLException
        Specified by:
        unwrap in interface java.sql.Wrapper
        Throws:
        java.sql.SQLException