You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by pv...@apache.org on 2020/09/29 09:08:56 UTC
[nifi] branch main updated: NIFI-7503: PutSQL - only call commit()
and rollback() if autocommit is disabled
This is an automated email from the ASF dual-hosted git repository.
pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 95fb8e3 NIFI-7503: PutSQL - only call commit() and rollback() if autocommit is disabled
95fb8e3 is described below
commit 95fb8e314421221a2fd062e67974b8a5199914ea
Author: Matthew Burgess <ma...@apache.org>
AuthorDate: Mon Sep 28 16:41:45 2020 -0400
NIFI-7503: PutSQL - only call commit() and rollback() if autocommit is disabled
Signed-off-by: Pierre Villard <pi...@gmail.com>
This closes #4558.
---
.../apache/nifi/processors/standard/PutSQL.java | 13 ++++++++---
.../nifi/processors/standard/TestPutSQL.java | 26 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSQL.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSQL.java
index 38e5bb9..812b9f7 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSQL.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSQL.java
@@ -142,7 +142,8 @@ public class PutSQL extends AbstractSessionFactoryProcessor {
static final PropertyDescriptor AUTO_COMMIT = new PropertyDescriptor.Builder()
.name("database-session-autocommit")
.displayName("Database Session AutoCommit")
- .description("The autocommit mode to set on the database connection being used.")
+ .description("The autocommit mode to set on the database connection being used. If set to false, the operation(s) will be explicitly committed or rolled back "
+ + "(based on success or failure respectively), if set to true the driver/database handles the commit/rollback.")
.allowableValues("true", "false")
.defaultValue("false")
.build();
@@ -553,7 +554,10 @@ public class PutSQL extends AbstractSessionFactoryProcessor {
process.onCompleted((c, s, fc, conn) -> {
try {
- conn.commit();
+ // Only call commit() if auto-commit is false, per the JDBC spec (see java.sql.Connection)
+ if (!conn.getAutoCommit()) {
+ conn.commit();
+ }
} catch (SQLException e) {
// Throw ProcessException to rollback process session.
throw new ProcessException("Failed to commit database connection due to " + e, e);
@@ -562,7 +566,10 @@ public class PutSQL extends AbstractSessionFactoryProcessor {
process.onFailed((c, s, fc, conn, e) -> {
try {
- conn.rollback();
+ // Only call rollback() if auto-commit is false, per the JDBC spec (see java.sql.Connection)
+ if (!conn.getAutoCommit()) {
+ conn.rollback();
+ }
} catch (SQLException re) {
// Just log the fact that rollback failed.
// ProcessSession will be rollback by the thrown Exception so don't have to do anything here.
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java
index 49fd43e..f28d05d 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java
@@ -132,6 +132,32 @@ public class TestPutSQL {
}
}
+ @Test
+ public void testCommitOnCleanup() throws InitializationException, ProcessException, SQLException {
+ final TestRunner runner = TestRunners.newTestRunner(PutSQL.class);
+ runner.addControllerService("dbcp", service);
+ runner.enableControllerService(service);
+ runner.setProperty(PutSQL.CONNECTION_POOL, "dbcp");
+ runner.setProperty(PutSQL.AUTO_COMMIT, "false");
+
+ recreateTable("PERSONS", createPersons);
+
+ runner.enqueue("INSERT INTO PERSONS (ID, NAME, CODE) VALUES (1, 'Mark', 84)".getBytes());
+ runner.run();
+
+ runner.assertAllFlowFilesTransferred(PutSQL.REL_SUCCESS, 1);
+
+ try (final Connection conn = service.getConnection()) {
+ try (final Statement stmt = conn.createStatement()) {
+ final ResultSet rs = stmt.executeQuery("SELECT * FROM PERSONS");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ assertEquals("Mark", rs.getString(2));
+ assertEquals(84, rs.getInt(3));
+ assertFalse(rs.next());
+ }
+ }
+ }
@Test
public void testInsertWithGeneratedKeys() throws InitializationException, ProcessException, SQLException, IOException {