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