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 © > {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></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> > >> > >> > > > > > > > > >