[
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: [email protected]
For additional commands, e-mail: [email protected]