In addition, the build is now failing to compile on Jenkins. Ralph
> On Jan 18, 2018, at 9:28 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote: > > -1 > > Please revert and move this to the log4j plugins project. > > Ralph > >> On Jan 18, 2018, at 8:54 PM, ggreg...@apache.org wrote: >> >> Repository: logging-log4j2 >> Updated Branches: >> refs/heads/master bb6fcd09e -> 639f093b8 >> >> >> [LOG4J2-2186] Add a JDBC ConnectionSource that provides pooling through >> Apache Commons DBCP 2. >> >> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/639f093b >> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/639f093b >> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/639f093b >> >> Branch: refs/heads/master >> Commit: 639f093b8103df2c2eda8d62fd12d7619d98ac04 >> Parents: bb6fcd0 >> Author: Gary Gregory <garydgreg...@gmail.com> >> Authored: Thu Jan 18 20:54:47 2018 -0700 >> Committer: Gary Gregory <garydgreg...@gmail.com> >> Committed: Thu Jan 18 20:54:47 2018 -0700 >> >> ---------------------------------------------------------------------- >> log4j-jdbc-dbcp2/pom.xml | 170 +++++++++++++++++++ >> .../db/jdbc/PoolingDriverConnectionSource.java | 155 +++++++++++++++++ >> log4j-jdbc-dbcp2/src/site/manual/index.md | 35 ++++ >> log4j-jdbc-dbcp2/src/site/site.xml | 52 ++++++ >> .../jdbc/PoolingDriverConnectionSourceTest.java | 96 +++++++++++ >> pom.xml | 1 + >> src/changes/changes.xml | 3 + >> src/site/xdoc/manual/appenders.xml | 28 ++- >> 8 files changed, 537 insertions(+), 3 deletions(-) >> ---------------------------------------------------------------------- >> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/log4j-jdbc-dbcp2/pom.xml >> ---------------------------------------------------------------------- >> diff --git a/log4j-jdbc-dbcp2/pom.xml b/log4j-jdbc-dbcp2/pom.xml >> new file mode 100644 >> index 0000000..18e0e86 >> --- /dev/null >> +++ b/log4j-jdbc-dbcp2/pom.xml >> @@ -0,0 +1,170 @@ >> +<?xml version="1.0" encoding="UTF-8"?> >> +<!-- ~ 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. --> >> + >> +<project xmlns="http://maven.apache.org/POM/4.0.0" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 >> http://maven.apache.org/xsd/maven-4.0.0.xsd"> >> + <parent> >> + <groupId>org.apache.logging.log4j</groupId> >> + <artifactId>log4j</artifactId> >> + <version>2.10.1-SNAPSHOT</version> >> + </parent> >> + <modelVersion>4.0.0</modelVersion> >> + >> + <artifactId>log4j-jdbc-dbcp2</artifactId> >> + <name>Apache Log4j JDBC DBCP 2</name> >> + <description> >> + Connection source for the JDBC Appender using on Apache Commons DBCP 2. >> + </description> >> + <properties> >> + <log4jParentDir>${basedir}/..</log4jParentDir> >> + <docLabel>Log4j JDBC DBCP 2 Documentation</docLabel> >> + <projectDir>/log4j-jdbc-dbcp2</projectDir> >> + <module.name>org.apache.logging.log4j.jdbc.dbcp2</module.name> >> + </properties> >> + >> + <dependencies> >> + <dependency> >> + <groupId>org.apache.logging.log4j</groupId> >> + <artifactId>log4j-core</artifactId> >> + </dependency> >> + <dependency> >> + <groupId>org.apache.commons</groupId> >> + <artifactId>commons-dbcp2</artifactId> >> + <version>2.2.0</version> >> + </dependency> >> + <!-- Test Dependencies --> >> + <dependency> >> + <groupId>junit</groupId> >> + <artifactId>junit</artifactId> >> + </dependency> >> + <dependency> >> + <groupId>org.apache.logging.log4j</groupId> >> + <artifactId>log4j-api</artifactId> >> + <type>test-jar</type> >> + </dependency> >> + <dependency> >> + <groupId>org.apache.logging.log4j</groupId> >> + <artifactId>log4j-core</artifactId> >> + <type>test-jar</type> >> + </dependency> >> + <dependency> >> + <groupId>com.h2database</groupId> >> + <artifactId>h2</artifactId> >> + <scope>test</scope> >> + </dependency> >> + </dependencies> >> + >> + <build> >> + <plugins> >> + <plugin> >> + <groupId>org.apache.felix</groupId> >> + <artifactId>maven-bundle-plugin</artifactId> >> + <configuration> >> + <instructions> >> + >> <Fragment-Host>org.apache.logging.log4j.core.appender.db.jdbc</Fragment-Host> >> + <Export-Package>*</Export-Package> >> + </instructions> >> + </configuration> >> + </plugin> >> + </plugins> >> + </build> >> + <reporting> >> + <plugins> >> + <plugin> >> + <groupId>org.apache.maven.plugins</groupId> >> + <artifactId>maven-changes-plugin</artifactId> >> + <version>${changes.plugin.version}</version> >> + <reportSets> >> + <reportSet> >> + <reports> >> + <report>changes-report</report> >> + </reports> >> + </reportSet> >> + </reportSets> >> + <configuration> >> + >> <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate> >> + <useJql>true</useJql> >> + </configuration> >> + </plugin> >> + <plugin> >> + <groupId>org.apache.maven.plugins</groupId> >> + <artifactId>maven-checkstyle-plugin</artifactId> >> + <version>${checkstyle.plugin.version}</version> >> + <configuration> >> + >> <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation> >> --> >> + <configLocation>${log4jParentDir}/checkstyle.xml</configLocation> >> + >> <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation> >> + <enableRulesSummary>false</enableRulesSummary> >> + <propertyExpansion>basedir=${basedir}</propertyExpansion> >> + >> <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion> >> + </configuration> >> + </plugin> >> + <plugin> >> + <groupId>org.apache.maven.plugins</groupId> >> + <artifactId>maven-javadoc-plugin</artifactId> >> + <version>${javadoc.plugin.version}</version> >> + <configuration> >> + <bottom><![CDATA[<p align="center">Copyright © >> {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br /> >> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather >> logo, the Apache Logging project logo, >> + and the Apache Log4j logo are trademarks of The Apache Software >> Foundation.</p>]]></bottom> >> + <!-- module link generation is completely broken in the javadoc >> plugin for a multi-module non-aggregating project --> >> + <detectOfflineLinks>false</detectOfflineLinks> >> + <linksource>true</linksource> >> + </configuration> >> + <reportSets> >> + <reportSet> >> + <id>non-aggregate</id> >> + <reports> >> + <report>javadoc</report> >> + </reports> >> + </reportSet> >> + </reportSets> >> + </plugin> >> + <plugin> >> + <groupId>org.codehaus.mojo</groupId> >> + <artifactId>findbugs-maven-plugin</artifactId> >> + <version>${findbugs.plugin.version}</version> >> + <configuration> >> + <fork>true</fork> >> + <jvmArgs>-Duser.language=en</jvmArgs> >> + <threshold>Normal</threshold> >> + <effort>Default</effort> >> + >> <excludeFilterFile>${log4jParentDir}/findbugs-exclude-filter.xml</excludeFilterFile> >> + </configuration> >> + </plugin> >> + <plugin> >> + <groupId>org.apache.maven.plugins</groupId> >> + <artifactId>maven-jxr-plugin</artifactId> >> + <version>${jxr.plugin.version}</version> >> + <reportSets> >> + <reportSet> >> + <id>non-aggregate</id> >> + <reports> >> + <report>jxr</report> >> + </reports> >> + </reportSet> >> + <reportSet> >> + <id>aggregate</id> >> + <reports> >> + <report>aggregate</report> >> + </reports> >> + </reportSet> >> + </reportSets> >> + </plugin> >> + <plugin> >> + <groupId>org.apache.maven.plugins</groupId> >> + <artifactId>maven-pmd-plugin</artifactId> >> + <version>${pmd.plugin.version}</version> >> + <configuration> >> + <targetJdk>${maven.compiler.target}</targetJdk> >> + </configuration> >> + </plugin> >> + </plugins> >> + </reporting> >> +</project> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java >> >> b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java >> new file mode 100644 >> index 0000000..80adbb3 >> --- /dev/null >> +++ >> b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java >> @@ -0,0 +1,155 @@ >> +/* >> + * 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.core.appender.db.jdbc; >> + >> +import java.sql.DriverManager; >> +import java.sql.SQLException; >> + >> +import org.apache.commons.dbcp2.ConnectionFactory; >> +import org.apache.commons.dbcp2.DriverManagerConnectionFactory; >> +import org.apache.commons.dbcp2.PoolableConnection; >> +import org.apache.commons.dbcp2.PoolableConnectionFactory; >> +import org.apache.commons.dbcp2.PoolingDriver; >> +import org.apache.commons.pool2.ObjectPool; >> +import org.apache.commons.pool2.impl.GenericObjectPool; >> +import org.apache.logging.log4j.core.Core; >> +import org.apache.logging.log4j.core.config.Property; >> +import org.apache.logging.log4j.core.config.plugins.Plugin; >> +import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; >> + >> +/** >> + * A {@link ConnectionSource} that uses a JDBC connection string, a user >> name, and a password to call >> + * {@link DriverManager#getConnection(String, String, String)}. The >> connections are served from an >> + * <a href="http://commons.apache.org/proper/commons-dbcp/">Apache Commons >> DBCP</a> pooling driver. >> + */ >> +@Plugin(name = "PoolingDriver", category = Core.CATEGORY_NAME, elementType >> = "connectionSource", printObject = true) >> +public final class PoolingDriverConnectionSource extends >> DriverManagerConnectionSource { >> + >> + /** >> + * Builds PoolingDriverConnectionSource instances. >> + * >> + * @param <B> >> + * This builder type or a subclass. >> + */ >> + public static class Builder<B extends Builder<B>> >> + extends DriverManagerConnectionSource.Builder<B, >> PoolingDriverConnectionSource> { >> + >> + public static final String DEFAULT_POOL_NAME = "example"; >> + private String poolName = DEFAULT_POOL_NAME; >> + >> + @Override >> + public PoolingDriverConnectionSource build() { >> + try { >> + return new >> PoolingDriverConnectionSource(getDriverClassName(), getConnectionString(), >> getUserName(), >> + getPassword(), getProperties(), poolName); >> + } catch (final SQLException e) { >> + getLogger().error("Exception constructing {} for {}", >> PoolingDriverConnectionSource.class, >> + getConnectionString(), e); >> + return null; >> + } >> + } >> + >> + public B setPoolName(final String poolName) { >> + this.poolName = poolName; >> + return asBuilder(); >> + } >> + } >> + >> + public static final String URL_PREFIX = "jdbc:apache:commons:dbcp:"; >> + >> + // This method is not named newBuilder() to make the compiler happy. >> + @PluginBuilderFactory >> + public static <B extends Builder<B>> B >> newPoolingDriverConnectionSourceBuilder() { >> + return new Builder<B>().asBuilder(); >> + } >> + >> + private final String poolingDriverClassName = >> "org.apache.commons.dbcp2.PoolingDriver"; >> + >> + private final String poolName; >> + >> + public PoolingDriverConnectionSource(final String driverClassName, >> final String connectionString, >> + final char[] userName, final char[] password, final Property[] >> properties, final String poolName) >> + throws SQLException { >> + super(driverClassName, connectionString, URL_PREFIX + poolName, >> userName, password, properties); >> + this.poolName = poolName; >> + setupDriver(connectionString); >> + } >> + >> + @Override >> + public String getActualConnectionString() { >> + // TODO Auto-generated method stub >> + return super.getActualConnectionString(); >> + } >> + >> + private PoolingDriver getPoolingDriver() throws SQLException { >> + final PoolingDriver driver = (PoolingDriver) >> DriverManager.getDriver(URL_PREFIX); >> + if (driver == null) { >> + getLogger().error("No JDBC driver for {}", URL_PREFIX); >> + } >> + return driver; >> + } >> + >> + private void setupDriver(final String connectionString) throws >> SQLException { >> + // >> + // First, we'll create a ConnectionFactory that the >> + // pool will use to create Connections. >> + // We'll use the DriverManagerConnectionFactory, >> + // using the connect string passed in the command line >> + // arguments. >> + // >> + final ConnectionFactory connectionFactory = new >> DriverManagerConnectionFactory(connectionString, null); >> + >> + // >> + // Next, we'll create the PoolableConnectionFactory, which wraps >> + // the "real" Connections created by the ConnectionFactory with >> + // the classes that implement the pooling functionality. >> + // >> + final PoolableConnectionFactory poolableConnectionFactory = new >> PoolableConnectionFactory(connectionFactory, >> + null); >> + >> + // >> + // Now we'll need a ObjectPool that serves as the >> + // actual pool of connections. >> + // >> + // We'll use a GenericObjectPool instance, although >> + // any ObjectPool implementation will suffice. >> + // >> + @SuppressWarnings("resource") >> + // This GenericObjectPool will be closed on shutown >> + final ObjectPool<PoolableConnection> connectionPool = new >> GenericObjectPool<>(poolableConnectionFactory); >> + >> + // Set the factory's pool property to the owning pool >> + poolableConnectionFactory.setPool(connectionPool); >> + >> + loadDriver(poolingDriverClassName); >> + final PoolingDriver driver = getPoolingDriver(); >> + if (driver != null) { >> + driver.registerPool(poolName, connectionPool); >> + } >> + // >> + // Now we can just use the connect string >> "jdbc:apache:commons:dbcp:example" >> + // to access our pool of Connections. >> + // >> + } >> + >> + public void shutdownDriver() throws SQLException { >> + final PoolingDriver driver = getPoolingDriver(); >> + if (driver != null) { >> + driver.closePool(poolName); >> + } >> + } >> +} >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/log4j-jdbc-dbcp2/src/site/manual/index.md >> ---------------------------------------------------------------------- >> diff --git a/log4j-jdbc-dbcp2/src/site/manual/index.md >> b/log4j-jdbc-dbcp2/src/site/manual/index.md >> new file mode 100644 >> index 0000000..b7fb5a5 >> --- /dev/null >> +++ b/log4j-jdbc-dbcp2/src/site/manual/index.md >> @@ -0,0 +1,35 @@ >> +<!-- vim: set syn=markdown : --> >> +<!-- >> + 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. >> +--> >> + >> +# Log4j 2 JDBC Connection Source with Apache Commons DBCP 2 >> + >> +This module adds a connection source for JDBC Appenders. The >> PoolingDriverConnectionSource >> +provides connection pooling through Apache Commons DBCP 2. >> + >> +## Requirements >> + >> +This module was introduced in Log4j 2.11.0 and requires Apache Commons DBCP >> 2 to provide >> +connection pooling. >> + >> +Some features may require optional >> +[dependencies](../runtime-dependencies.html). These dependencies are >> specified in the >> +documentation for those features. >> + >> +Some Log4j features require external dependencies. >> +See the [Dependency Tree](dependencies.html#Dependency_Tree) >> +for the exact list of JAR files needed for these features. >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/log4j-jdbc-dbcp2/src/site/site.xml >> ---------------------------------------------------------------------- >> diff --git a/log4j-jdbc-dbcp2/src/site/site.xml >> b/log4j-jdbc-dbcp2/src/site/site.xml >> new file mode 100644 >> index 0000000..6d4cddc >> --- /dev/null >> +++ b/log4j-jdbc-dbcp2/src/site/site.xml >> @@ -0,0 +1,52 @@ >> +<!-- >> + 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. >> + >> +--> >> +<project name="Log4j Core" >> + xmlns="http://maven.apache.org/DECORATION/1.4.0" >> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> + xsi:schemaLocation="http://maven.apache.org/DECORATION/1.4.0 >> http://maven.apache.org/xsd/decoration-1.4.0.xsd"> >> + <body> >> + <links> >> + <item name="Apache" href="http://www.apache.org/" /> >> + <item name="Logging Services" href="http://logging.apache.org/"/> >> + <item name="Log4j" href="../index.html"/> >> + </links> >> + >> + <!-- Component-specific reports --> >> + <menu ref="reports"/> >> + >> + <!-- Overall Project Info --> >> + <menu name="Log4j Project Information" img="icon-info-sign"> >> + <item name="Dependencies" href="../dependencies.html" /> >> + <item name="Dependency Convergence" >> href="../dependency-convergence.html" /> >> + <item name="Dependency Management" >> href="../dependency-management.html" /> >> + <item name="Project Team" href="../team-list.html" /> >> + <item name="Mailing Lists" href="../mail-lists.html" /> >> + <item name="Issue Tracking" href="../issue-tracking.html" /> >> + <item name="Project License" href="../license.html" /> >> + <item name="Source Repository" href="../source-repository.html" /> >> + <item name="Project Summary" href="../project-summary.html" /> >> + </menu> >> + >> + <menu name="Log4j Project Reports" img="icon-cog"> >> + <item name="Changes Report" href="../changes-report.html" /> >> + <item name="JIRA Report" href="../jira-report.html" /> >> + <item name="Surefire Report" href="../surefire-report.html" /> >> + <item name="RAT Report" href="../rat-report.html" /> >> + </menu> >> + </body> >> +</project> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >> >> b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >> new file mode 100644 >> index 0000000..2b7b886 >> --- /dev/null >> +++ >> b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >> @@ -0,0 +1,96 @@ >> +/* >> + * 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.core.appender.db.jdbc; >> + >> +import java.sql.Connection; >> +import java.sql.SQLException; >> + >> +import org.apache.logging.log4j.core.config.Property; >> +import org.junit.Assert; >> +import org.junit.Test; >> + >> +public class PoolingDriverConnectionSourceTest { >> + >> + @Test >> + public void testH2Properties() throws SQLException { >> + final Property[] properties = new Property[] { >> + // @formatter:off >> + Property.createProperty("username", >> JdbcH2TestHelper.USER_NAME), >> + Property.createProperty("password", >> JdbcH2TestHelper.PASSWORD), >> + // @formatter:on >> + }; >> + // @formatter:off >> + final PoolingDriverConnectionSource source = >> PoolingDriverConnectionSource.newPoolingDriverConnectionSourceBuilder() >> + .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING) >> + .setProperties(properties) >> + .build(); >> + // @formatter:on >> + try (Connection conn = source.getConnection()) { >> + Assert.assertFalse(conn.isClosed()); >> + } >> + } >> + >> + @Test >> + public void testH2PropertiesAndPoolName() throws SQLException { >> + final Property[] properties = new Property[] { >> + // @formatter:off >> + Property.createProperty("username", >> JdbcH2TestHelper.USER_NAME), >> + Property.createProperty("password", >> JdbcH2TestHelper.PASSWORD), >> + // @formatter:on >> + }; >> + // @formatter:off >> + final PoolingDriverConnectionSource source = >> PoolingDriverConnectionSource.newPoolingDriverConnectionSourceBuilder() >> + .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING) >> + .setProperties(properties) >> + .setPoolName("MyPoolName") >> + .build(); >> + // @formatter:on >> + try (Connection conn = source.getConnection()) { >> + Assert.assertFalse(conn.isClosed()); >> + } >> + } >> + >> + @Test >> + public void testH2UserAndPassword() throws SQLException { >> + // @formatter:off >> + final PoolingDriverConnectionSource source = >> PoolingDriverConnectionSource.newPoolingDriverConnectionSourceBuilder() >> + .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING) >> + .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray()) >> + .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray()) >> + .build(); >> + // @formatter:on >> + try (Connection conn = source.getConnection()) { >> + Assert.assertFalse(conn.isClosed()); >> + } >> + } >> + >> + @Test >> + public void testH2UserPasswordAndPoolName() throws SQLException { >> + // @formatter:off >> + final PoolingDriverConnectionSource source = >> PoolingDriverConnectionSource.newPoolingDriverConnectionSourceBuilder() >> + .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING) >> + .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray()) >> + .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray()) >> + .setPoolName("MyPoolName") >> + .build(); >> + // @formatter:on >> + try (Connection conn = source.getConnection()) { >> + Assert.assertFalse(conn.isClosed()); >> + } >> + } >> +} >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/pom.xml >> ---------------------------------------------------------------------- >> diff --git a/pom.xml b/pom.xml >> index 31195f2..f1027f2 100644 >> --- a/pom.xml >> +++ b/pom.xml >> @@ -1320,6 +1320,7 @@ >> <module>log4j-jmx-gui</module> >> <module>log4j-samples</module> >> <module>log4j-bom</module> >> + <module>log4j-jdbc-dbcp2</module> >> <module>log4j-couchdb</module> >> <module>log4j-mongodb</module> >> <module>log4j-cassandra</module> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/src/changes/changes.xml >> ---------------------------------------------------------------------- >> diff --git a/src/changes/changes.xml b/src/changes/changes.xml >> index 3ca94e4..6398bb0 100644 >> --- a/src/changes/changes.xml >> +++ b/src/changes/changes.xml >> @@ -104,6 +104,9 @@ >> <action issue="LOG4J2-2198" dev="ggregory" type="update"> >> Update MongoDB dependencies from classic to modern. >> </action> >> + <action issue="LOG4J2-2186" dev="ggregory" type="add"> >> + Add a JDBC ConnectionSource that provides pooling through Apache >> Commons DBCP 2. >> + </action> >> </release> >> <release version="2.10.0" date="2017-11-18" description="GA Release >> 2.10.0"> >> <action issue="LOG4J2-2120" dev="mikes" type="add" due-to="Carter >> Douglas Kozak "> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/639f093b/src/site/xdoc/manual/appenders.xml >> ---------------------------------------------------------------------- >> diff --git a/src/site/xdoc/manual/appenders.xml >> b/src/site/xdoc/manual/appenders.xml >> index c62a284..4f106df 100644 >> --- a/src/site/xdoc/manual/appenders.xml >> +++ b/src/site/xdoc/manual/appenders.xml >> @@ -1070,9 +1070,10 @@ CREATE TABLE logs ( >> <p>When configuring the JDBCAppender, you must specify a >> <code>ConnectionSource</code> implementation from >> which the Appender gets JDBC connections. You must use exactly >> one of the following nested elements:</p> >> <ul> >> - <li><a >> href="#JDBCDataSource"><code><DataSource></code></a></li> >> - <li><a >> href="#JDBCConnectionFactory"><code><ConnectionFactory></code></a></li> >> - <li><a >> href="#JDBCDriverManager"><code><DriverManager></code></a></li> >> + <li><a >> href="#JDBCDataSource"><code><DataSource></code></a>: Uses JNDI.</li> >> + <li><a >> href="#JDBCConnectionFactory"><code><ConnectionFactory></code></a>: >> Points to a class-method pair to provide JDBC connections.</li> >> + <li><a >> href="#JDBCDriverManager"><code><DriverManager></code></a>: A quick >> and dirty way to get off the ground, no connection pooling.</li> >> + <li><a >> href="#JDBCPoolingDriver"><code><PoolingDriver></code></a>: Uses >> Apache Commons DBCP to provide connection pooling.</li> >> </ul> >> <a name="JDBCDataSource"/> >> <table> >> @@ -1149,6 +1150,27 @@ CREATE TABLE logs ( >> <td>A list of properties. You cannot specify both properties >> and a user name or password.</td> >> </tr> >> </table> >> + <a name="JDBCPoolingDriver"/> >> + <table> >> + <caption align="top">PoolingDriver Parameters (Apache Commons >> DBCP)</caption> >> + <tr> >> + <th>Parameter Name</th> >> + <th>Type</th> >> + <th>Description</th> >> + </tr> >> + <tr> >> + <td>DriverManager parameters</td> >> + <td>DriverManager parameters</td> >> + <td>This connection source inherits all parameter from the >> DriverManager connection source.</td> >> + </tr> >> + <tr> >> + <td>poolName</td> >> + <td>String</td> >> + <td>The pool name used to pool JDBC Connections. Defaults to >> <code>example</code>. You can use the JDBC >> + connection string prefix >> <code>jdbc:apache:commons:dbcp:</code> followed by the pool name if you want >> + to use a pooled connection elsewhere. For example: >> <code>jdbc:apache:commons:dbcp:example</code>.</td> >> + </tr> >> + </table> >> <p>When configuring the JDBCAppender, use the nested >> <code><Column></code> elements to specify which >> columns in the table should be written to and how to write to >> them. The JDBCAppender uses this information >> to formulate a <code>PreparedStatement</code> to insert records >> without SQL injection vulnerability.</p> >> >> > > >