blob: 01993cf95aaee3c24c7a839f81c2b0e1912c2710 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.dbcp2.appender;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* Configures an Apache Commons DBCP {@link PoolableConnectionFactory}.
*
* @since 2.11.2
*/
@Plugin(name = "PoolableConnectionFactory", category = Core.CATEGORY_NAME, printObject = true)
public class PoolableConnectionFactoryConfig {
public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<PoolableConnectionFactoryConfig> {
private static final PoolableConnectionFactory DEFAULT = new PoolableConnectionFactory(null, null);
/**
* Internal constant to indicate the level is not set.
*/
private static final int UNKNOWN_TRANSACTION_ISOLATION = -1;
// All of these instance variables match DBCP WRT Boolean vs. boolean.
// All of these defaults are the same as in PoolableConnectionFactory.
@PluginBuilderAttribute
private boolean cacheState;
// TODO
@PluginElement("ConnectionInitSqls")
private String[] connectionInitSqls;
@PluginBuilderAttribute
private Boolean defaultAutoCommit;
@PluginBuilderAttribute
private String defaultCatalog;
@PluginBuilderAttribute
private Integer defaultQueryTimeoutSeconds = DEFAULT.getDefaultQueryTimeout();
@PluginBuilderAttribute
private Boolean defaultReadOnly;
@PluginBuilderAttribute
private int defaultTransactionIsolation = UNKNOWN_TRANSACTION_ISOLATION;
// TODO
@PluginElement("DisconnectionSqlCodes")
private String[] disconnectionSqlCodes = (String[]) (DEFAULT.getDisconnectionSqlCodes() == null ? null
: DEFAULT.getDisconnectionSqlCodes().toArray());
@PluginBuilderAttribute
private boolean autoCommitOnReturn = DEFAULT.isEnableAutoCommitOnReturn();
@PluginBuilderAttribute
private boolean fastFailValidation = DEFAULT.isFastFailValidation();
@PluginBuilderAttribute
private long maxConnLifetimeMillis = -1;
@PluginBuilderAttribute
private int maxOpenPreparedStatements = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
@PluginBuilderAttribute
private boolean poolStatements;
@PluginBuilderAttribute
private boolean rollbackOnReturn = DEFAULT.isRollbackOnReturn();
@PluginBuilderAttribute
private String validationQuery;
@PluginBuilderAttribute
private int validationQueryTimeoutSeconds = -1;
private List<String> asList(final String[] array) {
return array == null ? null : Arrays.asList(array);
}
@Override
public PoolableConnectionFactoryConfig build() {
return new PoolableConnectionFactoryConfig(cacheState, asList(connectionInitSqls), defaultAutoCommit,
defaultCatalog, defaultQueryTimeoutSeconds, defaultReadOnly, defaultTransactionIsolation,
asList(disconnectionSqlCodes), autoCommitOnReturn, fastFailValidation, maxConnLifetimeMillis,
maxOpenPreparedStatements, poolStatements, rollbackOnReturn, validationQuery,
validationQueryTimeoutSeconds);
}
public Builder setAutoCommitOnReturn(final boolean autoCommitOnReturn) {
this.autoCommitOnReturn = autoCommitOnReturn;
return this;
}
public Builder setCacheState(final boolean cacheState) {
this.cacheState = cacheState;
return this;
}
public Builder setConnectionInitSqls(final String... connectionInitSqls) {
this.connectionInitSqls = connectionInitSqls;
return this;
}
public Builder setDefaultAutoCommit(final Boolean defaultAutoCommit) {
this.defaultAutoCommit = defaultAutoCommit;
return this;
}
public Builder setDefaultCatalog(final String defaultCatalog) {
this.defaultCatalog = defaultCatalog;
return this;
}
public Builder setDefaultQueryTimeoutSeconds(final Integer defaultQueryTimeoutSeconds) {
this.defaultQueryTimeoutSeconds = defaultQueryTimeoutSeconds;
return this;
}
public Builder setDefaultReadOnly(final Boolean defaultReadOnly) {
this.defaultReadOnly = defaultReadOnly;
return this;
}
public Builder setDefaultTransactionIsolation(final int defaultTransactionIsolation) {
this.defaultTransactionIsolation = defaultTransactionIsolation;
return this;
}
public Builder setDisconnectionSqlCodes(final String... disconnectionSqlCodes) {
this.disconnectionSqlCodes = disconnectionSqlCodes;
return this;
}
public Builder setFastFailValidation(final boolean fastFailValidation) {
this.fastFailValidation = fastFailValidation;
return this;
}
public Builder setMaxConnLifetimeMillis(final long maxConnLifetimeMillis) {
this.maxConnLifetimeMillis = maxConnLifetimeMillis;
return this;
}
public Builder setMaxOpenPreparedStatements(final int maxOpenPreparedStatements) {
this.maxOpenPreparedStatements = maxOpenPreparedStatements;
return this;
}
public Builder setPoolStatements(final boolean poolStatements) {
this.poolStatements = poolStatements;
return this;
}
public Builder setRollbackOnReturn(final boolean rollbackOnReturn) {
this.rollbackOnReturn = rollbackOnReturn;
return this;
}
public Builder setValidationQuery(final String validationQuery) {
this.validationQuery = validationQuery;
return this;
}
public Builder setValidationQueryTimeoutSeconds(final int validationQueryTimeoutSeconds) {
this.validationQueryTimeoutSeconds = validationQueryTimeoutSeconds;
return this;
}
}
// ALL of these instance variables match DBCP WRT Boolean vs. boolean.
@PluginFactory
public static Builder newBuilder() {
return new Builder();
}
private final boolean cacheState;
private final Collection<String> connectionInitSqls;
private final Boolean defaultAutoCommit;
private final String defaultCatalog;
private final Integer defaultQueryTimeoutSeconds;
private final Boolean defaultReadOnly;
private final int defaultTransactionIsolation;
private final Collection<String> disconnectionSqlCodes;
private final boolean autoCommitOnReturn;
private final boolean fastFailValidation;
private final long maxConnLifetimeMillis;
private final int maxOpenPreparedStatements;
private final boolean poolStatements;
private final boolean rollbackOnReturn;
private final String validationQuery;
private final int validationQueryTimeoutSeconds;
private PoolableConnectionFactoryConfig(final boolean cacheState, final Collection<String> connectionInitSqls,
final Boolean defaultAutoCommit, final String defaultCatalog, final Integer defaultQueryTimeoutSeconds,
final Boolean defaultReadOnly, final int defaultTransactionIsolation,
final Collection<String> disconnectionSqlCodes, final boolean enableAutoCommitOnReturn,
final boolean fastFailValidation, final long maxConnLifetimeMillis, final int maxOpenPreparedStatements,
final boolean poolStatements, final boolean rollbackOnReturn, final String validationQuery,
final int validationQueryTimeoutSeconds) {
super();
this.cacheState = cacheState;
this.connectionInitSqls = connectionInitSqls;
this.defaultAutoCommit = defaultAutoCommit;
this.defaultCatalog = Strings.trimToNull(defaultCatalog);
this.defaultQueryTimeoutSeconds = defaultQueryTimeoutSeconds;
this.defaultReadOnly = defaultReadOnly;
this.defaultTransactionIsolation = defaultTransactionIsolation;
this.disconnectionSqlCodes = disconnectionSqlCodes;
this.autoCommitOnReturn = enableAutoCommitOnReturn;
this.fastFailValidation = fastFailValidation;
this.maxConnLifetimeMillis = maxConnLifetimeMillis;
this.maxOpenPreparedStatements = maxOpenPreparedStatements;
this.poolStatements = poolStatements;
this.rollbackOnReturn = rollbackOnReturn;
this.validationQuery = Strings.trimToNull(validationQuery);
this.validationQueryTimeoutSeconds = validationQueryTimeoutSeconds;
}
public void init(final PoolableConnectionFactory poolableConnectionFactory) {
if (poolableConnectionFactory != null) {
StatusLogger.getLogger().debug("Initializing PoolableConnectionFactory {} with {}",
poolableConnectionFactory, this);
poolableConnectionFactory.setCacheState(cacheState);
poolableConnectionFactory.setConnectionInitSql(connectionInitSqls);
poolableConnectionFactory.setDefaultAutoCommit(defaultAutoCommit);
poolableConnectionFactory.setDefaultCatalog(defaultCatalog);
poolableConnectionFactory.setDefaultQueryTimeout(defaultQueryTimeoutSeconds);
poolableConnectionFactory.setDefaultReadOnly(defaultReadOnly);
poolableConnectionFactory.setDefaultTransactionIsolation(defaultTransactionIsolation);
poolableConnectionFactory.setDisconnectionSqlCodes(disconnectionSqlCodes);
poolableConnectionFactory.setEnableAutoCommitOnReturn(autoCommitOnReturn);
poolableConnectionFactory.setFastFailValidation(fastFailValidation);
poolableConnectionFactory.setMaxConnLifetimeMillis(maxConnLifetimeMillis);
poolableConnectionFactory.setMaxOpenPreparedStatements(maxOpenPreparedStatements);
poolableConnectionFactory.setPoolStatements(poolStatements);
poolableConnectionFactory.setRollbackOnReturn(rollbackOnReturn);
poolableConnectionFactory.setValidationQuery(validationQuery);
poolableConnectionFactory.setValidationQueryTimeout(validationQueryTimeoutSeconds);
}
}
@Override
public String toString() {
return String.format(
"PoolableConnectionFactoryConfig [cacheState=%s, connectionInitSqls=%s, defaultAutoCommit=%s, defaultCatalog=%s, defaultQueryTimeoutSeconds=%s, defaultReadOnly=%s, defaultTransactionIsolation=%s, disconnectionSqlCodes=%s, enableAutoCommitOnReturn=%s, fastFailValidation=%s, maxConnLifetimeMillis=%s, maxOpenPreparedStatements=%s, poolStatements=%s, rollbackOnReturn=%s, validationQuery=%s, validationQueryTimeoutSeconds=%s]",
cacheState, connectionInitSqls, defaultAutoCommit, defaultCatalog, defaultQueryTimeoutSeconds,
defaultReadOnly, defaultTransactionIsolation, disconnectionSqlCodes, autoCommitOnReturn,
fastFailValidation, maxConnLifetimeMillis, maxOpenPreparedStatements, poolStatements, rollbackOnReturn,
validationQuery, validationQueryTimeoutSeconds);
}
}