[ 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