in src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java [233:334]
public static BasicDataSource createDataSource(final Properties properties) throws SQLException {
final BasicDataSource dataSource = new BasicDataSource();
acceptBoolean(properties, PROP_DEFAULT_AUTO_COMMIT, dataSource::setDefaultAutoCommit);
acceptBoolean(properties, PROP_DEFAULT_READ_ONLY, dataSource::setDefaultReadOnly);
getOptional(properties, PROP_DEFAULT_TRANSACTION_ISOLATION).ifPresent(value -> {
value = value.toUpperCase(Locale.ROOT);
int level = PoolableConnectionFactory.UNKNOWN_TRANSACTION_ISOLATION;
switch (value) {
case "NONE":
level = Connection.TRANSACTION_NONE;
break;
case "READ_COMMITTED":
level = Connection.TRANSACTION_READ_COMMITTED;
break;
case "READ_UNCOMMITTED":
level = Connection.TRANSACTION_READ_UNCOMMITTED;
break;
case "REPEATABLE_READ":
level = Connection.TRANSACTION_REPEATABLE_READ;
break;
case "SERIALIZABLE":
level = Connection.TRANSACTION_SERIALIZABLE;
break;
default:
try {
level = Integer.parseInt(value);
} catch (final NumberFormatException e) {
System.err.println("Could not parse defaultTransactionIsolation: " + value);
System.err.println("WARNING: defaultTransactionIsolation not set");
System.err.println("using default value of database driver");
level = PoolableConnectionFactory.UNKNOWN_TRANSACTION_ISOLATION;
}
break;
}
dataSource.setDefaultTransactionIsolation(level);
});
acceptString(properties, PROP_DEFAULT_SCHEMA, dataSource::setDefaultSchema);
acceptString(properties, PROP_DEFAULT_CATALOG, dataSource::setDefaultCatalog);
acceptBoolean(properties, PROP_CACHE_STATE, dataSource::setCacheState);
acceptString(properties, PROP_DRIVER_CLASS_NAME, dataSource::setDriverClassName);
acceptBoolean(properties, PROP_LIFO, dataSource::setLifo);
acceptInt(properties, PROP_MAX_TOTAL, dataSource::setMaxTotal);
acceptInt(properties, PROP_MAX_IDLE, dataSource::setMaxIdle);
acceptInt(properties, PROP_MIN_IDLE, dataSource::setMinIdle);
acceptInt(properties, PROP_INITIAL_SIZE, dataSource::setInitialSize);
acceptDurationOfMillis(properties, PROP_MAX_WAIT_MILLIS, dataSource::setMaxWait);
acceptBoolean(properties, PROP_TEST_ON_CREATE, dataSource::setTestOnCreate);
acceptBoolean(properties, PROP_TEST_ON_BORROW, dataSource::setTestOnBorrow);
acceptBoolean(properties, PROP_TEST_ON_RETURN, dataSource::setTestOnReturn);
acceptDurationOfMillis(properties, PROP_TIME_BETWEEN_EVICTION_RUNS_MILLIS, dataSource::setDurationBetweenEvictionRuns);
acceptInt(properties, PROP_NUM_TESTS_PER_EVICTION_RUN, dataSource::setNumTestsPerEvictionRun);
acceptDurationOfMillis(properties, PROP_MIN_EVICTABLE_IDLE_TIME_MILLIS, dataSource::setMinEvictableIdle);
acceptDurationOfMillis(properties, PROP_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS, dataSource::setSoftMinEvictableIdle);
acceptString(properties, PROP_EVICTION_POLICY_CLASS_NAME, dataSource::setEvictionPolicyClassName);
acceptBoolean(properties, PROP_TEST_WHILE_IDLE, dataSource::setTestWhileIdle);
acceptString(properties, PROP_PASSWORD, dataSource::setPassword);
acceptString(properties, PROP_URL, dataSource::setUrl);
acceptString(properties, PROP_USER_NAME, dataSource::setUsername);
acceptString(properties, PROP_VALIDATION_QUERY, dataSource::setValidationQuery);
acceptDurationOfSeconds(properties, PROP_VALIDATION_QUERY_TIMEOUT, dataSource::setValidationQueryTimeout);
acceptBoolean(properties, PROP_ACCESS_TO_UNDERLYING_CONNECTION_ALLOWED, dataSource::setAccessToUnderlyingConnectionAllowed);
acceptBoolean(properties, PROP_REMOVE_ABANDONED_ON_BORROW, dataSource::setRemoveAbandonedOnBorrow);
acceptBoolean(properties, PROP_REMOVE_ABANDONED_ON_MAINTENANCE, dataSource::setRemoveAbandonedOnMaintenance);
acceptDurationOfSeconds(properties, PROP_REMOVE_ABANDONED_TIMEOUT, dataSource::setRemoveAbandonedTimeout);
acceptBoolean(properties, PROP_LOG_ABANDONED, dataSource::setLogAbandoned);
acceptBoolean(properties, PROP_ABANDONED_USAGE_TRACKING, dataSource::setAbandonedUsageTracking);
acceptBoolean(properties, PROP_POOL_PREPARED_STATEMENTS, dataSource::setPoolPreparedStatements);
acceptBoolean(properties, PROP_CLEAR_STATEMENT_POOL_ON_RETURN, dataSource::setClearStatementPoolOnReturn);
acceptInt(properties, PROP_MAX_OPEN_PREPARED_STATEMENTS, dataSource::setMaxOpenPreparedStatements);
getOptional(properties, PROP_CONNECTION_INIT_SQLS).ifPresent(v -> dataSource.setConnectionInitSqls(parseList(v, ';')));
final String value = properties.getProperty(PROP_CONNECTION_PROPERTIES);
if (value != null) {
for (final Object key : getProperties(value).keySet()) {
final String propertyName = Objects.toString(key, null);
dataSource.addConnectionProperty(propertyName, getProperties(value).getProperty(propertyName));
}
}
acceptDurationOfMillis(properties, PROP_MAX_CONN_LIFETIME_MILLIS, dataSource::setMaxConn);
acceptBoolean(properties, PROP_LOG_EXPIRED_CONNECTIONS, dataSource::setLogExpiredConnections);
acceptString(properties, PROP_JMX_NAME, dataSource::setJmxName);
acceptBoolean(properties, PROP_REGISTER_CONNECTION_MBEAN, dataSource::setRegisterConnectionMBean);
acceptBoolean(properties, PROP_ENABLE_AUTO_COMMIT_ON_RETURN, dataSource::setAutoCommitOnReturn);
acceptBoolean(properties, PROP_ROLLBACK_ON_RETURN, dataSource::setRollbackOnReturn);
acceptDurationOfSeconds(properties, PROP_DEFAULT_QUERY_TIMEOUT, dataSource::setDefaultQueryTimeout);
acceptBoolean(properties, PROP_FAST_FAIL_VALIDATION, dataSource::setFastFailValidation);
getOptional(properties, PROP_DISCONNECTION_SQL_CODES).ifPresent(v -> dataSource.setDisconnectionSqlCodes(parseList(v, ',')));
getOptional(properties, PROP_DISCONNECTION_IGNORE_SQL_CODES).ifPresent(v -> dataSource.setDisconnectionIgnoreSqlCodes(parseList(v, ',')));
acceptString(properties, PROP_CONNECTION_FACTORY_CLASS_NAME, dataSource::setConnectionFactoryClassName);
// DBCP-215
// Trick to make sure that initialSize connections are created
if (dataSource.getInitialSize() > 0) {
dataSource.getLogWriter();
}
// Return the configured DataSource instance
return dataSource;
}