This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-dbcp.git
commit 580083315e87d7ba320640d14f58075f059496f5 Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Tue Jul 30 21:25:31 2019 -0400 Extract commons code into new private methods and sort methods. Remove trailing whitespace. Javadoc. --- .../apache/commons/dbcp2/DelegatingConnection.java | 3 +- .../commons/dbcp2/PoolablePreparedStatement.java | 2 +- .../dbcp2/cpdsadapter/DriverAdapterCPDS.java | 675 +++++++++++---------- 3 files changed, 347 insertions(+), 333 deletions(-) diff --git a/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java b/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java index 02b5ac1..a5518c3 100644 --- a/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java +++ b/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java @@ -253,7 +253,8 @@ public class DelegatingConnection<C extends Connection> extends AbandonedTrace i /** * Handles the given {@code SQLException}. * - * @param e The SQLException + * @param <T> The throwable type. + * @param e The SQLException * @return the given {@code SQLException} * @since 2.7.0 */ diff --git a/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java b/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java index 91386b0..7dbbe49 100644 --- a/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java +++ b/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java @@ -39,7 +39,7 @@ import org.apache.commons.pool2.KeyedObjectPool; * @since 2.0 */ public class PoolablePreparedStatement<K> extends DelegatingPreparedStatement { - + /** * The {@link KeyedObjectPool} from which I was obtained. */ diff --git a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java index d039a49..bd3d297 100644 --- a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java +++ b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java @@ -86,6 +86,11 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl private static final String GET_CONNECTION_CALLED = "A PooledConnection was already requested from this source, " + "further initialization is not allowed."; + static { + // Attempt to prevent deadlocks - see DBCP - 272 + DriverManager.getDrivers(); + } + /** Description */ private String description; @@ -106,13 +111,13 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl /** Log stream. NOT USED */ private transient PrintWriter logWriter; - // PreparedStatement pool properties private boolean poolPreparedStatements; private int maxIdle = 10; private long timeBetweenEvictionRunsMillis = BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; private int numTestsPerEvictionRun = -1; private int minEvictableIdleTimeMillis = -1; + private int maxPreparedStatements = -1; /** Whether or not getConnection has been called */ @@ -121,11 +126,6 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl /** Connection properties passed to JDBC Driver */ private Properties connectionProperties; - static { - // Attempt to prevent deadlocks - see DBCP - 272 - DriverManager.getDrivers(); - } - /** * Controls access to the underlying connection */ @@ -138,6 +138,208 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl } /** + * Throws an IllegalStateException, if a PooledConnection has already been requested. + */ + private void assertInitializationAllowed() throws IllegalStateException { + if (getConnectionCalled) { + throw new IllegalStateException(GET_CONNECTION_CALLED); + } + } + + private boolean getBooleanContentString(RefAddr ra) { + return Boolean.valueOf(getStringContent(ra)).booleanValue(); + } + + /** + * Gets the connection properties passed to the JDBC driver. + * + * @return the JDBC connection properties used when creating connections. + */ + public Properties getConnectionProperties() { + return connectionProperties; + } + + /** + * Gets the value of description. This property is here for use by the code which will deploy this datasource. It is + * not used internally. + * + * @return value of description, may be null. + * @see #setDescription(String) + */ + public String getDescription() { + return description; + } + + /** + * Gets the driver class name. + * + * @return value of driver. + */ + public String getDriver() { + return driver; + } + + private int getIntegerStringContent(final RefAddr ra) { + return Integer.parseInt(getStringContent(ra)); + } + + /** + * Gets the maximum time in seconds that this data source can wait while attempting to connect to a database. NOT + * USED. + */ + @Override + public int getLoginTimeout() { + return loginTimeout; + } + + /** + * Gets the log writer for this data source. NOT USED. + */ + @Override + public PrintWriter getLogWriter() { + return logWriter; + } + + /** + * Gets the maximum number of statements that can remain idle in the pool, without extra ones being released, or + * negative for no limit. + * + * @return the value of maxIdle + */ + public int getMaxIdle() { + return this.maxIdle; + } + + /** + * Gets the maximum number of prepared statements. + * + * @return maxPrepartedStatements value + */ + public int getMaxPreparedStatements() { + return maxPreparedStatements; + } + + /** + * Gets the minimum amount of time a statement may sit idle in the pool before it is eligible for eviction by the + * idle object evictor (if any). + * + * @see #setMinEvictableIdleTimeMillis + * @see #setTimeBetweenEvictionRunsMillis + * @return the minimum amount of time a statement may sit idle in the pool. + */ + public int getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + /** + * Gets the number of statements to examine during each run of the idle object evictor thread (if any.) + * + * @see #setNumTestsPerEvictionRun + * @see #setTimeBetweenEvictionRunsMillis + * @return the number of statements to examine during each run of the idle object evictor thread (if any.) + */ + public int getNumTestsPerEvictionRun() { + return numTestsPerEvictionRun; + } + + /** + * Implements {@link ObjectFactory} to create an instance of this class + */ + @Override + public Object getObjectInstance(final Object refObj, final Name name, final Context context, + final Hashtable<?, ?> env) throws Exception { + // The spec says to return null if we can't create an instance + // of the reference + DriverAdapterCPDS cpds = null; + if (refObj instanceof Reference) { + final Reference ref = (Reference) refObj; + if (ref.getClassName().equals(getClass().getName())) { + RefAddr ra = ref.get("description"); + if (isNotEmpty(ra)) { + setDescription(getStringContent(ra)); + } + + ra = ref.get("driver"); + if (isNotEmpty(ra)) { + setDriver(getStringContent(ra)); + } + ra = ref.get("url"); + if (isNotEmpty(ra)) { + setUrl(getStringContent(ra)); + } + ra = ref.get(KEY_USER); + if (isNotEmpty(ra)) { + setUser(getStringContent(ra)); + } + ra = ref.get(KEY_PASSWORD); + if (isNotEmpty(ra)) { + setPassword(getStringContent(ra)); + } + + ra = ref.get("poolPreparedStatements"); + if (isNotEmpty(ra)) { + setPoolPreparedStatements(getBooleanContentString(ra)); + } + ra = ref.get("maxIdle"); + if (isNotEmpty(ra)) { + setMaxIdle(getIntegerStringContent(ra)); + } + + ra = ref.get("timeBetweenEvictionRunsMillis"); + if (isNotEmpty(ra)) { + setTimeBetweenEvictionRunsMillis(getIntegerStringContent(ra)); + } + + ra = ref.get("numTestsPerEvictionRun"); + if (isNotEmpty(ra)) { + setNumTestsPerEvictionRun(getIntegerStringContent(ra)); + } + + ra = ref.get("minEvictableIdleTimeMillis"); + if (isNotEmpty(ra)) { + setMinEvictableIdleTimeMillis(getIntegerStringContent(ra)); + } + ra = ref.get("maxPreparedStatements"); + if (isNotEmpty(ra)) { + setMaxPreparedStatements(getIntegerStringContent(ra)); + } + + ra = ref.get("accessToUnderlyingConnectionAllowed"); + if (isNotEmpty(ra)) { + setAccessToUnderlyingConnectionAllowed(getBooleanContentString(ra)); + } + + cpds = this; + } + } + return cpds; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + throw new SQLFeatureNotSupportedException(); + } + + /** + * Gets the value of password for the default user. + * + * @return value of password. + */ + public String getPassword() { + return Utils.toString(userPassword); + } + + /** + * Gets the value of password for the default user. + * + * @return value of password. + * @since 2.4.0 + */ + public char[] getPasswordCharArray() { + return userPassword; + } + + /** * Attempts to establish a database connection using the default user and password. */ @Override @@ -208,11 +410,6 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl return pooledConnection; } - @Override - public Logger getParentLogger() throws SQLFeatureNotSupportedException { - throw new SQLFeatureNotSupportedException(); - } - /** * Implements {@link Referenceable}. */ @@ -240,250 +437,110 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl return ref; } - /** - * Implements {@link ObjectFactory} to create an instance of this class - */ - @Override - public Object getObjectInstance(final Object refObj, final Name name, final Context context, - final Hashtable<?, ?> env) throws Exception { - // The spec says to return null if we can't create an instance - // of the reference - DriverAdapterCPDS cpds = null; - if (refObj instanceof Reference) { - final Reference ref = (Reference) refObj; - if (ref.getClassName().equals(getClass().getName())) { - RefAddr ra = ref.get("description"); - if (ra != null && ra.getContent() != null) { - setDescription(ra.getContent().toString()); - } - - ra = ref.get("driver"); - if (ra != null && ra.getContent() != null) { - setDriver(ra.getContent().toString()); - } - ra = ref.get("url"); - if (ra != null && ra.getContent() != null) { - setUrl(ra.getContent().toString()); - } - ra = ref.get(KEY_USER); - if (ra != null && ra.getContent() != null) { - setUser(ra.getContent().toString()); - } - ra = ref.get(KEY_PASSWORD); - if (ra != null && ra.getContent() != null) { - setPassword(ra.getContent().toString()); - } - - ra = ref.get("poolPreparedStatements"); - if (ra != null && ra.getContent() != null) { - setPoolPreparedStatements(Boolean.valueOf(ra.getContent().toString()).booleanValue()); - } - ra = ref.get("maxIdle"); - if (ra != null && ra.getContent() != null) { - setMaxIdle(Integer.parseInt(ra.getContent().toString())); - } - - ra = ref.get("timeBetweenEvictionRunsMillis"); - if (ra != null && ra.getContent() != null) { - setTimeBetweenEvictionRunsMillis(Integer.parseInt(ra.getContent().toString())); - } - - ra = ref.get("numTestsPerEvictionRun"); - if (ra != null && ra.getContent() != null) { - setNumTestsPerEvictionRun(Integer.parseInt(ra.getContent().toString())); - } - - ra = ref.get("minEvictableIdleTimeMillis"); - if (ra != null && ra.getContent() != null) { - setMinEvictableIdleTimeMillis(Integer.parseInt(ra.getContent().toString())); - } - ra = ref.get("maxPreparedStatements"); - if (ra != null && ra.getContent() != null) { - setMaxPreparedStatements(Integer.parseInt(ra.getContent().toString())); - } - - ra = ref.get("accessToUnderlyingConnectionAllowed"); - if (ra != null && ra.getContent() != null) { - setAccessToUnderlyingConnectionAllowed(Boolean.valueOf(ra.getContent().toString()).booleanValue()); - } - - cpds = this; - } - } - return cpds; + private String getStringContent(RefAddr ra) { + return ra.getContent().toString(); } /** - * Throws an IllegalStateException, if a PooledConnection has already been requested. - */ - private void assertInitializationAllowed() throws IllegalStateException { - if (getConnectionCalled) { - throw new IllegalStateException(GET_CONNECTION_CALLED); - } - } - - /** - * Gets the connection properties passed to the JDBC driver. - * - * @return the JDBC connection properties used when creating connections. - */ - public Properties getConnectionProperties() { - return connectionProperties; - } - - /** - * <p> - * Sets the connection properties passed to the JDBC driver. - * </p> - * - * <p> - * If <code>props</code> contains "user" and/or "password" properties, the corresponding instance properties are - * set. If these properties are not present, they are filled in using {@link #getUser()}, {@link #getPassword()} - * when {@link #getPooledConnection()} is called, or using the actual parameters to the method call when - * {@link #getPooledConnection(String, String)} is called. Calls to {@link #setUser(String)} or - * {@link #setPassword(String)} overwrite the values of these properties if <code>connectionProperties</code> is not - * null. - * </p> - * - * @param props - * Connection properties to use when creating new connections. - * @throws IllegalStateException - * if {@link #getPooledConnection()} has been called - */ - public void setConnectionProperties(final Properties props) { - assertInitializationAllowed(); - connectionProperties = props; - if (connectionProperties != null) { - if (connectionProperties.containsKey(KEY_USER)) { - setUser(connectionProperties.getProperty(KEY_USER)); - } - if (connectionProperties.containsKey(KEY_PASSWORD)) { - setPassword(connectionProperties.getProperty(KEY_PASSWORD)); - } - } - } - - /** - * Gets the value of description. This property is here for use by the code which will deploy this datasource. It is - * not used internally. - * - * @return value of description, may be null. - * @see #setDescription(String) - */ - public String getDescription() { - return description; - } - - /** - * Sets the value of description. This property is here for use by the code which will deploy this datasource. It is - * not used internally. - * - * @param v - * Value to assign to description. - */ - public void setDescription(final String v) { - this.description = v; - } - - /** - * Gets the value of password for the default user. - * - * @return value of password. - * @since 2.4.0 - */ - public char[] getPasswordCharArray() { - return userPassword; - } - - /** - * Gets the value of password for the default user. + * Gets the number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no + * idle object evictor thread will be run. * - * @return value of password. + * @return the value of the evictor thread timer + * @see #setTimeBetweenEvictionRunsMillis(long) */ - public String getPassword() { - return Utils.toString(userPassword); + public long getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; } /** - * Sets the value of password for the default user. + * Gets the value of url used to locate the database for this datasource. * - * @param userPassword - * Value to assign to password. - * @throws IllegalStateException - * if {@link #getPooledConnection()} has been called + * @return value of url. */ - public void setPassword(final char[] userPassword) { - assertInitializationAllowed(); - this.userPassword = Utils.clone(userPassword); - update(connectionProperties, KEY_PASSWORD, Utils.toString(this.userPassword)); + public String getUrl() { + return url; } /** - * Sets the value of password for the default user. + * Gets the value of default user (login or user name). * - * @param userPassword - * Value to assign to password. - * @throws IllegalStateException - * if {@link #getPooledConnection()} has been called + * @return value of user. */ - public void setPassword(final String userPassword) { - assertInitializationAllowed(); - this.userPassword = Utils.toCharArray(userPassword); - update(connectionProperties, KEY_PASSWORD, userPassword); + public String getUser() { + return userName; } /** - * Gets the value of url used to locate the database for this datasource. + * Returns the value of the accessToUnderlyingConnectionAllowed property. * - * @return value of url. - */ - public String getUrl() { - return url; + * @return true if access to the underlying is allowed, false otherwise. + */ + public synchronized boolean isAccessToUnderlyingConnectionAllowed() { + return this.accessToUnderlyingConnectionAllowed; + } + + private boolean isNotEmpty(RefAddr ra) { + return ra != null && ra.getContent() != null; } /** - * Sets the value of URL string used to locate the database for this datasource. + * Whether to toggle the pooling of <code>PreparedStatement</code>s * - * @param v - * Value to assign to url. - * @throws IllegalStateException - * if {@link #getPooledConnection()} has been called + * @return value of poolPreparedStatements. */ - public void setUrl(final String v) { - assertInitializationAllowed(); - this.url = v; + public boolean isPoolPreparedStatements() { + return poolPreparedStatements; } /** - * Gets the value of default user (login or user name). + * Sets the value of the accessToUnderlyingConnectionAllowed property. It controls if the PoolGuard allows access to + * the underlying connection. (Default: false) * - * @return value of user. + * @param allow + * Access to the underlying connection is granted when true. */ - public String getUser() { - return userName; + public synchronized void setAccessToUnderlyingConnectionAllowed(final boolean allow) { + this.accessToUnderlyingConnectionAllowed = allow; } /** - * Sets the value of default user (login or user name). + * Sets the connection properties passed to the JDBC driver. + * <p> + * If <code>props</code> contains "user" and/or "password" properties, the corresponding instance properties are + * set. If these properties are not present, they are filled in using {@link #getUser()}, {@link #getPassword()} + * when {@link #getPooledConnection()} is called, or using the actual parameters to the method call when + * {@link #getPooledConnection(String, String)} is called. Calls to {@link #setUser(String)} or + * {@link #setPassword(String)} overwrite the values of these properties if <code>connectionProperties</code> is not + * null. + * </p> * - * @param v - * Value to assign to user. + * @param props + * Connection properties to use when creating new connections. * @throws IllegalStateException * if {@link #getPooledConnection()} has been called */ - public void setUser(final String v) { + public void setConnectionProperties(final Properties props) { assertInitializationAllowed(); - this.userName = v; - update(connectionProperties, KEY_USER, v); + connectionProperties = props; + if (connectionProperties != null) { + if (connectionProperties.containsKey(KEY_USER)) { + setUser(connectionProperties.getProperty(KEY_USER)); + } + if (connectionProperties.containsKey(KEY_PASSWORD)) { + setPassword(connectionProperties.getProperty(KEY_PASSWORD)); + } + } } /** - * Gets the driver class name. + * Sets the value of description. This property is here for use by the code which will deploy this datasource. It is + * not used internally. * - * @return value of driver. + * @param v + * Value to assign to description. */ - public String getDriver() { - return driver; + public void setDescription(final String v) { + this.description = v; } /** @@ -505,23 +562,6 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl } /** - * Gets the maximum time in seconds that this data source can wait while attempting to connect to a database. NOT - * USED. - */ - @Override - public int getLoginTimeout() { - return loginTimeout; - } - - /** - * Gets the log writer for this data source. NOT USED. - */ - @Override - public PrintWriter getLogWriter() { - return logWriter; - } - - /** * Sets the maximum time in seconds that this data source will wait while attempting to connect to a database. NOT * USED. */ @@ -539,38 +579,6 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl } /** - * Whether to toggle the pooling of <code>PreparedStatement</code>s - * - * @return value of poolPreparedStatements. - */ - public boolean isPoolPreparedStatements() { - return poolPreparedStatements; - } - - /** - * Whether to toggle the pooling of <code>PreparedStatement</code>s - * - * @param poolPreparedStatements - * true to pool statements. - * @throws IllegalStateException - * if {@link #getPooledConnection()} has been called - */ - public void setPoolPreparedStatements(final boolean poolPreparedStatements) { - assertInitializationAllowed(); - this.poolPreparedStatements = poolPreparedStatements; - } - - /** - * Gets the maximum number of statements that can remain idle in the pool, without extra ones being released, or - * negative for no limit. - * - * @return the value of maxIdle - */ - public int getMaxIdle() { - return this.maxIdle; - } - - /** * Gets the maximum number of statements that can remain idle in the pool, without extra ones being released, or * negative for no limit. * @@ -585,41 +593,29 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl } /** - * Gets the number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no - * idle object evictor thread will be run. + * Sets the maximum number of prepared statements. * - * @return the value of the evictor thread timer - * @see #setTimeBetweenEvictionRunsMillis(long) + * @param maxPreparedStatements + * the new maximum number of prepared statements */ - public long getTimeBetweenEvictionRunsMillis() { - return timeBetweenEvictionRunsMillis; + public void setMaxPreparedStatements(final int maxPreparedStatements) { + this.maxPreparedStatements = maxPreparedStatements; } /** - * Sets the number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no - * idle object evictor thread will be run. + * Sets the minimum amount of time a statement may sit idle in the pool before it is eligible for eviction by the + * idle object evictor (if any). When non-positive, no objects will be evicted from the pool due to idle time alone. * - * @param timeBetweenEvictionRunsMillis - * The number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, - * no idle object evictor thread will be run. - * @see #getTimeBetweenEvictionRunsMillis() + * @param minEvictableIdleTimeMillis + * minimum time to set (in ms) + * @see #getMinEvictableIdleTimeMillis() + * @see #setTimeBetweenEvictionRunsMillis(long) * @throws IllegalStateException * if {@link #getPooledConnection()} has been called */ - public void setTimeBetweenEvictionRunsMillis(final long timeBetweenEvictionRunsMillis) { + public void setMinEvictableIdleTimeMillis(final int minEvictableIdleTimeMillis) { assertInitializationAllowed(); - this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; - } - - /** - * Gets the number of statements to examine during each run of the idle object evictor thread (if any.) - * - * @see #setNumTestsPerEvictionRun - * @see #setTimeBetweenEvictionRunsMillis - * @return the number of statements to examine during each run of the idle object evictor thread (if any.) - */ - public int getNumTestsPerEvictionRun() { - return numTestsPerEvictionRun; + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } /** @@ -643,80 +639,87 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl } /** - * Gets the minimum amount of time a statement may sit idle in the pool before it is eligible for eviction by the - * idle object evictor (if any). + * Sets the value of password for the default user. * - * @see #setMinEvictableIdleTimeMillis - * @see #setTimeBetweenEvictionRunsMillis - * @return the minimum amount of time a statement may sit idle in the pool. + * @param userPassword + * Value to assign to password. + * @throws IllegalStateException + * if {@link #getPooledConnection()} has been called */ - public int getMinEvictableIdleTimeMillis() { - return minEvictableIdleTimeMillis; + public void setPassword(final char[] userPassword) { + assertInitializationAllowed(); + this.userPassword = Utils.clone(userPassword); + update(connectionProperties, KEY_PASSWORD, Utils.toString(this.userPassword)); } /** - * Sets the minimum amount of time a statement may sit idle in the pool before it is eligible for eviction by the - * idle object evictor (if any). When non-positive, no objects will be evicted from the pool due to idle time alone. + * Sets the value of password for the default user. * - * @param minEvictableIdleTimeMillis - * minimum time to set (in ms) - * @see #getMinEvictableIdleTimeMillis() - * @see #setTimeBetweenEvictionRunsMillis(long) + * @param userPassword + * Value to assign to password. * @throws IllegalStateException * if {@link #getPooledConnection()} has been called */ - public void setMinEvictableIdleTimeMillis(final int minEvictableIdleTimeMillis) { + public void setPassword(final String userPassword) { assertInitializationAllowed(); - this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + this.userPassword = Utils.toCharArray(userPassword); + update(connectionProperties, KEY_PASSWORD, userPassword); } /** - * Returns the value of the accessToUnderlyingConnectionAllowed property. + * Whether to toggle the pooling of <code>PreparedStatement</code>s * - * @return true if access to the underlying is allowed, false otherwise. + * @param poolPreparedStatements + * true to pool statements. + * @throws IllegalStateException + * if {@link #getPooledConnection()} has been called */ - public synchronized boolean isAccessToUnderlyingConnectionAllowed() { - return this.accessToUnderlyingConnectionAllowed; + public void setPoolPreparedStatements(final boolean poolPreparedStatements) { + assertInitializationAllowed(); + this.poolPreparedStatements = poolPreparedStatements; } /** - * Sets the value of the accessToUnderlyingConnectionAllowed property. It controls if the PoolGuard allows access to - * the underlying connection. (Default: false) + * Sets the number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no + * idle object evictor thread will be run. * - * @param allow - * Access to the underlying connection is granted when true. + * @param timeBetweenEvictionRunsMillis + * The number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, + * no idle object evictor thread will be run. + * @see #getTimeBetweenEvictionRunsMillis() + * @throws IllegalStateException + * if {@link #getPooledConnection()} has been called */ - public synchronized void setAccessToUnderlyingConnectionAllowed(final boolean allow) { - this.accessToUnderlyingConnectionAllowed = allow; + public void setTimeBetweenEvictionRunsMillis(final long timeBetweenEvictionRunsMillis) { + assertInitializationAllowed(); + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } /** - * Gets the maximum number of prepared statements. + * Sets the value of URL string used to locate the database for this datasource. * - * @return maxPrepartedStatements value + * @param v + * Value to assign to url. + * @throws IllegalStateException + * if {@link #getPooledConnection()} has been called */ - public int getMaxPreparedStatements() { - return maxPreparedStatements; + public void setUrl(final String v) { + assertInitializationAllowed(); + this.url = v; } /** - * Sets the maximum number of prepared statements. + * Sets the value of default user (login or user name). * - * @param maxPreparedStatements - * the new maximum number of prepared statements + * @param v + * Value to assign to user. + * @throws IllegalStateException + * if {@link #getPooledConnection()} has been called */ - public void setMaxPreparedStatements(final int maxPreparedStatements) { - this.maxPreparedStatements = maxPreparedStatements; - } - - private void update(final Properties properties, final String key, final String value) { - if (properties != null && key != null) { - if (value == null) { - properties.remove(key); - } else { - properties.setProperty(key, value); - } - } + public void setUser(final String v) { + assertInitializationAllowed(); + this.userName = v; + update(connectionProperties, KEY_USER, v); } /** @@ -763,4 +766,14 @@ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceabl builder.append("]"); return builder.toString(); } + + private void update(final Properties properties, final String key, final String value) { + if (properties != null && key != null) { + if (value == null) { + properties.remove(key); + } else { + properties.setProperty(key, value); + } + } + } }