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">