This looks promising: http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html (especially the @NotThreadSafe annotation, potentially in combination with JUnit Suits)
On Sun, Jan 21, 2018 at 13:12 Remko Popma <remko.po...@gmail.com> wrote: > Mikael, Ralph, > > Have you really thought through the implications of having a separate > repository for each module? The overhead is very large! > > It would mean: > * a separate website for each repo (our current Log4j2 website only knows > about the modules in the logging-log4j project). > * a separate release and release vote would need to be performed *for each > repo*. This process is so heavy that we only do it once a month for Log4j2. > Imagine doing this 10 times when we have 10 modules each in separate repos. > * synchronizing with the main Log4j project becomes checking and updating > 10 projects instead of one. > > All of these concerns already hold for a single log4j-plugins project, > they just multiply for each additional repo. > > All, > > Gary does have a point when he says we don’t have a clear plan for > managing the log4j-plugins repo. Who is going to check that the plugins > still compile after a Log4j2 release? Are we going to release a new plugins > version for each Log4j2 release? If not, when _will_ we release new > log4j-plugins versions? > > Given our terrible track record for the log4j-tools project since we > moved TcpServer etc. into that repo (nobody showing interest to do the > work to release it), I agree these are valid concerns. > > On the other hand, I also completely agree with Ralph that the build takes > much too long. Something needs to be done and Ralph is clearly signalling > he won't have this problem ignored any longer. > > I'm not sure that moving things out of the main repo is the only solution > to make the build faster. If it really is the *only* solution, then fine. > But be mindful we are trading one problem for a set of new ones, and, just > like we can't ignore the slow build problem, we also cannot ignore the new > problems introduced by this solution (keeping the new repo(s) in sync, > building new web sites and linking them into the main site, release timing > etc). > > PROPOSAL: > I think all of us should take responsibility for speeding up the build and > make it our first priority. > If you want to add anything to the main project, *first reduce the build > duration*. First find an existing test and speed it up. Only then add new > stuff, keeping the total build time to the same or less than it was > before. Building core and running its tests used to take 8 minutes. Now it > takes 19:10 (`mvn clean package` on the whole project takes 24:22). > > The core tests clearly are a major bottleneck. > > Speeding up the core tests is something we can all work on. Can we split > the tests into a set that can be run multi-threaded in parallel (fastest), > a different set that does not require forking (fast) and a third set that > requires forking for every test (slowest)? > > On the other hand, if we want to move things out of the main repo we need > a plan for the new repo(s). There is a one-time work of setting up web > sites and integrating them with the main site, but on an ongoing basis we > need some way to verify that a change in log4j-core did not break any > plugins, and agree to do a plugins release if it did break something. > > Remko > > > On Sun, Jan 21, 2018 at 2:27 Ralph Goers <ralph.go...@dslextreme.com> > wrote: > >> I am fine with doing that but we would still want a way to get to all the >> plugin sites from the log4j web site. Maven does that and maintains a list >> at https://maven.apache.org/plugins/ <https://maven.apache.org/plugins/>. >> I think the easiest way to manage a page like that would to have it be a >> separate page in the CMS that the log4j site links to. >> >> Ralph >> >> > On Jan 20, 2018, at 8:29 AM, Mikael Ståldal <mi...@apache.org> wrote: >> > >> > 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 © >> >>>>>> {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>& >> >>>> lt;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> >> >>>>>>>> >> >>>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>> >> >>>>>> >> >>>>>> >> >>>> >> >>>> >> >>>> >> > >> > >> > >> >>