This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new f5810db  [LOG4J2-2660] Retry when JDBC throws a 
java.sql.SQLTransactionRollbackException in commitAndClose().
f5810db is described below

commit f5810dbed755378710eacfee9c71305b541bf404
Author: Gary Gregory <[email protected]>
AuthorDate: Sat Jul 20 20:34:35 2019 -0400

    [LOG4J2-2660] Retry when JDBC throws a
    java.sql.SQLTransactionRollbackException in commitAndClose().
    
    - Revert a previous commit's change away from
    DbAppenderLoggingException.
---
 .../appender/db/DbAppenderLoggingException.java    | 31 +++++++++++++++++++++-
 .../log4j/jdbc/appender/JdbcDatabaseManager.java   | 15 ++++++++---
 src/changes/changes.xml                            |  3 +++
 3 files changed, 44 insertions(+), 5 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/DbAppenderLoggingException.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/DbAppenderLoggingException.java
index 389d26c..5545984 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/DbAppenderLoggingException.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/DbAppenderLoggingException.java
@@ -26,8 +26,37 @@ public class DbAppenderLoggingException extends 
AppenderLoggingException {
 
     private static final long serialVersionUID = 1L;
 
-    public DbAppenderLoggingException(String message, Throwable cause) {
+    /**
+     * Constructs an exception with a message.
+     *
+     * @param format The reason format for the exception, see {@link 
String#format(String, Object...)}.
+     * @param args The reason arguments for the exception, see {@link 
String#format(String, Object...)}.
+     * @since 2.12.1
+     */
+    public DbAppenderLoggingException(String format, Object... args) {
+        super(format, args);
+    }
+
+    /**
+     * Constructs an exception with a message and underlying cause.
+     *
+     * @param message The reason for the exception
+     * @param cause The underlying cause of the exception
+     */
+    public DbAppenderLoggingException(final String message, final Throwable 
cause) {
         super(message, cause);
     }
 
+    /**
+     * Constructs an exception with a message.
+     *
+     * @param cause The underlying cause of the exception
+     * @param format The reason format for the exception, see {@link 
String#format(String, Object...)}.
+     * @param args The reason arguments for the exception, see {@link 
String#format(String, Object...)}.
+     * @since 2.12.1
+     */
+    public DbAppenderLoggingException(Throwable cause, String format, 
Object... args) {
+        super(cause, format, args);
+    }
+
 }
diff --git 
a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
 
b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
index ba8cbdc..82eb79e 100644
--- 
a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
+++ 
b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
@@ -25,6 +25,7 @@ import java.sql.NClob;
 import java.sql.PreparedStatement;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.SQLTransactionRollbackException;
 import java.sql.Statement;
 import java.sql.Timestamp;
 import java.sql.Types;
@@ -45,11 +46,11 @@ import 
org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager;
 import org.apache.logging.log4j.core.appender.db.ColumnMapping;
 import org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException;
-import org.apache.logging.log4j.plugins.convert.TypeConverters;
 import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.core.util.Log4jThread;
 import org.apache.logging.log4j.jdbc.convert.DateTypeConverter;
 import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
 import org.apache.logging.log4j.spi.ThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextStack;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
@@ -479,14 +480,20 @@ public final class JdbcDatabaseManager extends 
AbstractDatabaseManager {
             if (this.connection != null && !this.connection.isClosed()) {
                 if (this.isBatchSupported && this.statement != null) {
                     logger().debug("Executing batch PreparedStatement {}", 
this.statement);
-                    final int[] result = this.statement.executeBatch();
+                    int[] result;
+                    try {
+                        result = this.statement.executeBatch();
+                    } catch (SQLTransactionRollbackException e) {
+                        logger().debug("{} executing batch PreparedStatement 
{}, retrying.", e, this.statement);
+                        result = this.statement.executeBatch();
+                    }
                     logger().debug("Batch result: {}", 
Arrays.toString(result));
                 }
                 logger().debug("Committing Connection {}", this.connection);
                 this.connection.commit();
             }
         } catch (final SQLException e) {
-            throw new AppenderLoggingException(e, "Failed to commit 
transaction logging event or flushing buffer [%s]",
+            throw new DbAppenderLoggingException(e, "Failed to commit 
transaction logging event or flushing buffer [%s]",
                     fieldsToString());
         } finally {
             closeResources(true);
@@ -777,7 +784,7 @@ public final class JdbcDatabaseManager extends 
AbstractDatabaseManager {
                         "No records inserted in database table for log event 
in JDBC manager [%s].", fieldsToString());
             }
         } catch (final SQLException e) {
-            throw new AppenderLoggingException(e, "Failed to insert record for 
log event in JDBC manager: %s [%s]", e,
+            throw new DbAppenderLoggingException(e, "Failed to insert record 
for log event in JDBC manager: %s [%s]", e,
                     fieldsToString());
         } finally {
             // Release ASAP
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8da790c..f33715c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -161,6 +161,9 @@
       <action issue="LOG4J2-2659" dev="ckozak" type="fix">
         AbstractAction handles and records unchecked RuntimeException and 
Error in addition to IOException.
       </action>
+      <action issue="LOG4J2-2660" dev="ggregory" type="update">
+        Retry when JDBC throws a java.sql.SQLTransactionRollbackException in 
commitAndClose().
+      </action>
     </release>
     <release version="2.12.0" date="2019-06-23" description="GA Release 
2.12.0">
       <action issue="LOG4J2-2547" dev="rgoers" type="fix">

Reply via email to