As I wrote recently, I don't think that having a kitchen-sink plugins repository is a good way to solve this. Eventually that repository will get too big.

It's better to create a new repository for each new module (or possibly for a couple of related modules, but they should be more related than just being Log4j plugins).


On 2018-01-19 06:31, Ralph Goers wrote:
Gary, I am complaining because I perform the releases. You never have. We keep 
adding more and more crap to the build and it keeps taking longer and longer. 
Af far as I am concerned that is a valid technical reason.

My -1 stands.

Ralph


On Jan 18, 2018, at 10:24 PM, Gary Gregory <garydgreg...@gmail.com> wrote:

On Thu, Jan 18, 2018 at 10:20 PM, Ralph Goers <ralph.go...@dslextreme.com>
wrote:

OK, but that doesn’t resolve the initial problem. The log4j 2 project is
too large.


 From what I've experienced, folks complain about the size of the api and
core jars, not the Maven project.

What is the target size/metric if it is currently "too large"? ;-)

Gary


Ralph

On Jan 18, 2018, at 10:15 PM, Gary Gregory <garydgreg...@gmail.com>
wrote:

On Thu, Jan 18, 2018 at 9:43 PM, Ralph Goers <ralph.go...@dslextreme.com

wrote:

In addition, the build is now failing to compile on Jenkins.


Oops, please accept my apologies. I got caught by the Eclipse compiler
being more forgiving (or more powerful) than the Oracle compiler in the
generics department. All of that despite the Maven partial builds I ran.
I
must have not run the clean goal or some-such.

Gary


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 &#169;
{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>&
lt;DataSource&gt;</code></a></li>
-            <li><a href="#JDBCConnectionFactory">
<code>&lt;ConnectionFactory&gt;</code></a></li>
-            <li><a href="#JDBCDriverManager"><
code>&lt;DriverManager&gt;</code></a></li>
+            <li><a href="#JDBCDataSource"><code>&
lt;DataSource&gt;</code></a>:
Uses JNDI.</li>
+            <li><a href="#JDBCConnectionFactory">
<code>&lt;ConnectionFactory&gt;</code></a>: Points to a class-method
pair
to provide JDBC connections.</li>
+            <li><a href="#JDBCDriverManager"><
code>&lt;DriverManager&gt;</code></a>: A quick and dirty way to get off
the ground, no connection pooling.</li>
+            <li><a href="#JDBCPoolingDriver"><
code>&lt;PoolingDriver&gt;</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>&lt;Column&gt;</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>
















Reply via email to