public static BasicDataSource createDataSource()

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;
    }