[ 
https://issues.apache.org/jira/browse/LOG4J2-438?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nick Williams resolved LOG4J2-438.
----------------------------------

       Resolution: Fixed
    Fix Version/s: 2.0-rc1

Fixed with r1565858 and r1565878. The database appenders now connect to the 
database (i.e., borrow from the connection pool) and begin a transaction on 
every flush or every non-buffered {{writeInternal}}, then commit and disconnect 
(i.e., return to pool) at the end of the flush or non-buffered 
{{writeInternal}}.

Note also that the {{<DriverManager...>}} connection source plugin is no longer 
available. It was removed because it was unsafe and didn't support connection 
pooling. Please use the {{<DataSource...>}} or {{<ConnectionFactory...>}} 
connection source plugins, instead.

> JDBCDatabaseManager does not send commit command
> ------------------------------------------------
>
>                 Key: LOG4J2-438
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-438
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Appenders
>    Affects Versions: 2.0-beta9
>         Environment: Java 7u45, Windows, H2
>            Reporter: Ralph Schaer
>            Assignee: Nick Williams
>            Priority: Minor
>             Fix For: 2.0-rc1
>
>         Attachments: 0001-Add-transaction-wrapper.patch, 
> 0002-Add-transaction-support-for-AbstractDatabaseManager.patch
>
>
> I'm fiddling with the log4j jdbc appender and found an issue with datasources 
> that have the flag defaultAutoCommit set to false. With such datasources the 
> application has to call the method connection.commit() after an update 
> statement, if omitted nothing will be updated or inserted in the database.
> That is the problem with the class JDBCDatabaseManager. It executes the 
> statement (with this.statement.executeUpdate()) but does not call commit. 
> Nothing is inserted if the defaultAutoCommit flag of the datasource is set to 
> false. 
> One possible solution is to check the autoCommit flag of the datasource and 
> call commit when it's set to false.
> if (this.statement.executeUpdate() == 0) {
>   throw new AppenderLoggingException(
>    "No records inserted in database table for log event in JDBC manager.");
> }
>                       
> if (!this.connection.getAutoCommit()) {
>   this.connection.commit();
> }
> Maybe this has to be done differently when a buffer is used. The method 
> AbstractDatabaseManager.flush should only call commit after the loop. 
>         if (this.isConnected() && this.buffer.size() > 0) {
>             for (final LogEvent event : this.buffer) {
>                 this.writeInternal(event);
>             }
>            if (!connection.getAutoCommit()) {
>               connection.commit();
>            }
>             this.buffer.clear();
>         }
> Or maybe using the batch methods of jdbc would improve the performance even 
> more
> if (this.isConnected() && this.buffer.size() > 0) {
>   for (final LogEvent event : this.buffer) {
>     //create statement .......
>     statement.addBatch()
>   }
>   statement.executeBatch();
>   if (!connection.getAutoCommit()) {
>     connection.commit();
>   }
>   this.buffer.clear();
> }



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to