You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ni...@apache.org on 2020/10/06 08:22:13 UTC

[activemq-artemis] branch master updated: ARTEMIS-2823 Use datasource with JDBC store db connections fixes

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

nigrofranz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/master by this push:
     new b4532d9  ARTEMIS-2823 Use datasource with JDBC store db connections fixes
     new 74dfd19  This closes #3288
b4532d9 is described below

commit b4532d944d04ad91ff09d9ecc429fa8b4fcd475e
Author: franz1981 <ni...@gmail.com>
AuthorDate: Fri Sep 11 00:24:12 2020 +0200

    ARTEMIS-2823 Use datasource with JDBC store db connections fixes
    
    It add additional required fixes:
    - Fixed uncommitted deleted tx records
    - Fixed JDBC authorization on test
    - Using property-based version for commons-dbcp2
    - stopping thread pool after activation to allow JDBC lease locks to release the lock
    - centralize JDBC network timeout configuration and save repeating it
    - adding dbcp2 as the default pooled DataSource to be used
---
 artemis-distribution/src/main/assembly/dep.xml     |   2 +
 artemis-features/src/main/resources/features.xml   |   2 +
 artemis-jdbc-store/pom.xml                         |   1 -
 .../jdbc/store/drivers/JDBCConnectionProvider.java |  30 +++--
 .../jdbc/store/journal/JDBCJournalImpl.java        | 136 ++++++++++-----------
 .../storage/DatabaseStorageConfiguration.java      |  19 ++-
 .../deployers/impl/FileConfigurationParser.java    |   1 -
 .../impl/journal/JDBCJournalStorageManager.java    |   4 -
 .../core/server/impl/ActiveMQServerImpl.java       |  40 +++++-
 pom.xml                                            |  12 +-
 .../jdbc/store/journal/JDBCJournalTest.java        |   2 +
 11 files changed, 150 insertions(+), 99 deletions(-)

diff --git a/artemis-distribution/src/main/assembly/dep.xml b/artemis-distribution/src/main/assembly/dep.xml
index 92196c4..b9b2496 100644
--- a/artemis-distribution/src/main/assembly/dep.xml
+++ b/artemis-distribution/src/main/assembly/dep.xml
@@ -83,6 +83,8 @@
             <include>org.jboss.logging:jboss-logging</include>
             <include>org.jboss.slf4j:slf4j-jboss-logmanager</include>
             <include>org.jctools:jctools-core</include>
+            <include>org.apache.commons:commons-dbcp2</include>
+            <include>org.apache.commons:commons-pool2</include>
             <include>io.netty:netty-all</include>
             <include>org.apache.qpid:proton-j</include>
             <include>org.apache.activemq:activemq-client</include>
diff --git a/artemis-features/src/main/resources/features.xml b/artemis-features/src/main/resources/features.xml
index 96aaa1a..a67cfb5 100644
--- a/artemis-features/src/main/resources/features.xml
+++ b/artemis-features/src/main/resources/features.xml
@@ -72,6 +72,8 @@
 		<bundle dependency="true">mvn:org.apache.commons/commons-lang3/${commons.lang.version}</bundle>
 		<bundle dependency="true">mvn:org.jctools/jctools-core/${jctools.version}</bundle>
 		<bundle dependency="true">mvn:com.google.guava/guava/${guava.version}</bundle>
+		<bundle dependency="true">mvn:org.apache.commons/commons-dbcp2/${commons.dbcp2.version}</bundle>
+		<bundle dependency="true">mvn:org.apache.commons/commons-pool2/${commons.dbcp2.version}</bundle>
 		<!-- Micrometer can't be included until it supports OSGi. It is currently an "optional" Maven dependency. -->
 		<!--bundle dependency="true">mvn:io.micrometer/micrometer-core/${version.micrometer}</bundle-->
 
diff --git a/artemis-jdbc-store/pom.xml b/artemis-jdbc-store/pom.xml
index fe43920..52ab7b2 100644
--- a/artemis-jdbc-store/pom.xml
+++ b/artemis-jdbc-store/pom.xml
@@ -85,7 +85,6 @@
       <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-dbcp2</artifactId>
-         <version>2.1.1</version>
       </dependency>
 
       <!-- Database driver support -->
diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/JDBCConnectionProvider.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/JDBCConnectionProvider.java
index 6d2c9f2..72e971a 100644
--- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/JDBCConnectionProvider.java
+++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/JDBCConnectionProvider.java
@@ -16,10 +16,6 @@
  */
 package org.apache.activemq.artemis.jdbc.store.drivers;
 
-import org.apache.activemq.artemis.jdbc.store.logging.LoggingConnection;
-import org.apache.activemq.artemis.journal.ActiveMQJournalLogger;
-import org.jboss.logging.Logger;
-
 import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.DriverManager;
@@ -27,17 +23,23 @@ import java.sql.SQLException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.activemq.artemis.jdbc.store.logging.LoggingConnection;
+import org.apache.activemq.artemis.journal.ActiveMQJournalLogger;
+import org.jboss.logging.Logger;
+
 public class JDBCConnectionProvider {
 
    private static final Logger logger = Logger.getLogger(JDBCConnectionProvider.class);
    private DataSource dataSource;
    private Executor networkTimeoutExecutor;
    private int networkTimeoutMillis;
+   private boolean supportNetworkTimeout;
 
    public JDBCConnectionProvider(DataSource dataSource) {
       this.dataSource = dataSource;
       this.networkTimeoutExecutor = null;
       this.networkTimeoutMillis = -1;
+      this.supportNetworkTimeout = true;
       addDerbyShutdownHook();
    }
 
@@ -58,14 +60,18 @@ public class JDBCConnectionProvider {
       }
 
       if (this.networkTimeoutMillis >= 0 && this.networkTimeoutExecutor != null) {
-         try {
-            connection.setNetworkTimeout(this.networkTimeoutExecutor, this.networkTimeoutMillis);
-         } catch (SQLException e) {
-            logger.warn(JDBCUtils.appendSQLExceptionDetails(new StringBuilder(), e));
-            ActiveMQJournalLogger.LOGGER.warn("Unable to set a network timeout on the JDBC connection");
-         } catch (Throwable throwable) {
-            //it included SecurityExceptions and UnsupportedOperationException
-            logger.warn("Unable to set a network timeout on the JDBC connection", throwable);
+         if (supportNetworkTimeout) {
+            try {
+               connection.setNetworkTimeout(this.networkTimeoutExecutor, this.networkTimeoutMillis);
+            } catch (SQLException e) {
+               supportNetworkTimeout = false;
+               logger.warn(JDBCUtils.appendSQLExceptionDetails(new StringBuilder(), e));
+               ActiveMQJournalLogger.LOGGER.warn("Unable to set a network timeout on the JDBC connection: won't retry again in the future");
+            } catch (Throwable throwable) {
+               supportNetworkTimeout = false;
+               //it included SecurityExceptions and UnsupportedOperationException
+               logger.warn("Unable to set a network timeout on the JDBC connection: won't retry again in the future", throwable);
+            }
          }
       }
       return connection;
diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
index a15377e..fe341e4 100644
--- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
+++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
@@ -189,70 +189,67 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
 
       TransactionHolder holder;
 
-      try (Connection connection = connectionProvider.getConnection()) {
-
-         try (PreparedStatement deleteJournalRecords = connection.prepareStatement(this.deleteJournalRecords);
-              PreparedStatement deleteJournalTxRecords = connection.prepareStatement(this.deleteJournalTxRecords);
-              PreparedStatement insertJournalRecords = connection.prepareStatement(this.insertJournalRecords)) {
-
-            connection.setAutoCommit(false);
-
-            for (JDBCJournalRecord record : recordRef) {
+      try (Connection connection = connectionProvider.getConnection();
+           PreparedStatement deleteJournalRecords = connection.prepareStatement(this.deleteJournalRecords);
+           PreparedStatement deleteJournalTxRecords = connection.prepareStatement(this.deleteJournalTxRecords);
+           PreparedStatement insertJournalRecords = connection.prepareStatement(this.insertJournalRecords)) {
 
-               if (logger.isTraceEnabled()) {
-                  logger.trace("sync::preparing JDBC statement for " + record);
-               }
+         connection.setAutoCommit(false);
 
+         for (JDBCJournalRecord record : recordRef) {
 
-               switch (record.getRecordType()) {
-                  case JDBCJournalRecord.DELETE_RECORD:
-                     // Standard SQL Delete Record, Non transactional delete
-                     deletedRecords.add(record.getId());
-                     record.writeDeleteRecord(deleteJournalRecords);
-                     break;
-                  case JDBCJournalRecord.ROLLBACK_RECORD:
-                     // Roll back we remove all records associated with this TX ID.  This query is always performed last.
-                     deleteJournalTxRecords.setLong(1, record.getTxId());
-                     deleteJournalTxRecords.addBatch();
-                     break;
-                  case JDBCJournalRecord.COMMIT_RECORD:
-                     // We perform all the deletes and add the commit record in the same Database TX
-                     holder = transactions.get(record.getTxId());
-                     for (RecordInfo info : holder.recordsToDelete) {
-                        deletedRecords.add(record.getId());
-                        deletedRecords.add(info.id);
-                        deleteJournalRecords.setLong(1, info.id);
-                        deleteJournalRecords.addBatch();
-                     }
-                     record.writeRecord(insertJournalRecords);
-                     committedTransactions.add(record.getTxId());
-                     break;
-                  default:
-                     // Default we add a new record to the DB
-                     record.writeRecord(insertJournalRecords);
-                     break;
-               }
+            if (logger.isTraceEnabled()) {
+               logger.trace("sync::preparing JDBC statement for " + record);
             }
 
-            insertJournalRecords.executeBatch();
-            deleteJournalRecords.executeBatch();
-            deleteJournalTxRecords.executeBatch();
 
-            connection.commit();
-            if (logger.isTraceEnabled()) {
-               logger.trace("JDBC commit worked");
+            switch (record.getRecordType()) {
+               case JDBCJournalRecord.DELETE_RECORD:
+                  // Standard SQL Delete Record, Non transactional delete
+                  deletedRecords.add(record.getId());
+                  record.writeDeleteRecord(deleteJournalRecords);
+                  break;
+               case JDBCJournalRecord.ROLLBACK_RECORD:
+                  // Roll back we remove all records associated with this TX ID.  This query is always performed last.
+                  deleteJournalTxRecords.setLong(1, record.getTxId());
+                  deleteJournalTxRecords.addBatch();
+                  break;
+               case JDBCJournalRecord.COMMIT_RECORD:
+                  // We perform all the deletes and add the commit record in the same Database TX
+                  holder = transactions.get(record.getTxId());
+                  for (RecordInfo info : holder.recordsToDelete) {
+                     deletedRecords.add(record.getId());
+                     deletedRecords.add(info.id);
+                     deleteJournalRecords.setLong(1, info.id);
+                     deleteJournalRecords.addBatch();
+                  }
+                  record.writeRecord(insertJournalRecords);
+                  committedTransactions.add(record.getTxId());
+                  break;
+               default:
+                  // Default we add a new record to the DB
+                  record.writeRecord(insertJournalRecords);
+                  break;
             }
+         }
 
-            if (cleanupTxRecords(deletedRecords, committedTransactions)) {
-               deleteJournalTxRecords.executeBatch();
-               connection.commit();
-               logger.trace("JDBC commit worked on cleanupTxRecords");
-            }
-            executeCallbacks(recordRef, true);
+         insertJournalRecords.executeBatch();
+         deleteJournalRecords.executeBatch();
+         deleteJournalTxRecords.executeBatch();
 
-            return recordRef.size();
+         connection.commit();
+         if (logger.isTraceEnabled()) {
+            logger.trace("JDBC commit worked");
+         }
 
+         if (cleanupTxRecords(deletedRecords, committedTransactions, deleteJournalTxRecords)) {
+            deleteJournalTxRecords.executeBatch();
+            connection.commit();
+            logger.trace("JDBC commit worked on cleanupTxRecords");
          }
+         executeCallbacks(recordRef, true);
+
+         return recordRef.size();
       } catch (Exception e) {
          handleException(recordRef, e);
          return 0;
@@ -276,7 +273,8 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
 
    /* We store Transaction reference in memory (once all records associated with a Tranascation are Deleted,
       we remove the Tx Records (i.e. PREPARE, COMMIT). */
-   private synchronized boolean cleanupTxRecords(List<Long> deletedRecords, List<Long> committedTx) throws SQLException {
+   private synchronized boolean cleanupTxRecords(List<Long> deletedRecords, List<Long> committedTx,
+                                                 PreparedStatement deleteJournalTxRecords) throws SQLException {
       List<RecordInfo> iterableCopy;
       List<TransactionHolder> iterableCopyTx = new ArrayList<>();
       iterableCopyTx.addAll(transactions.values());
@@ -285,27 +283,23 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
          transactions.get(txId).committed = true;
       }
       boolean hasDeletedJournalTxRecords = false;
+      // TODO (mtaylor) perhaps we could store a reverse mapping of IDs to prevent this O(n) loop
+      for (TransactionHolder h : iterableCopyTx) {
 
-      try (Connection connection = connectionProvider.getConnection();
-           PreparedStatement deleteJournalTxRecords = connection.prepareStatement(this.deleteJournalTxRecords)) {
-         // TODO (mtaylor) perhaps we could store a reverse mapping of IDs to prevent this O(n) loop
-         for (TransactionHolder h : iterableCopyTx) {
-
-            iterableCopy = new ArrayList<>();
-            iterableCopy.addAll(h.recordInfos);
+         iterableCopy = new ArrayList<>();
+         iterableCopy.addAll(h.recordInfos);
 
-            for (RecordInfo info : iterableCopy) {
-               if (deletedRecords.contains(info.id)) {
-                  h.recordInfos.remove(info);
-               }
+         for (RecordInfo info : iterableCopy) {
+            if (deletedRecords.contains(info.id)) {
+               h.recordInfos.remove(info);
             }
+         }
 
-            if (h.recordInfos.isEmpty() && h.committed) {
-               deleteJournalTxRecords.setLong(1, h.transactionID);
-               deleteJournalTxRecords.addBatch();
-               hasDeletedJournalTxRecords = true;
-               transactions.remove(h.transactionID);
-            }
+         if (h.recordInfos.isEmpty() && h.committed) {
+            deleteJournalTxRecords.setLong(1, h.transactionID);
+            deleteJournalTxRecords.addBatch();
+            hasDeletedJournalTxRecords = true;
+            transactions.remove(h.transactionID);
          }
       }
       return hasDeletedJournalTxRecords;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/storage/DatabaseStorageConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/storage/DatabaseStorageConfiguration.java
index 3a059f0..76d8e4e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/storage/DatabaseStorageConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/storage/DatabaseStorageConfiguration.java
@@ -17,6 +17,9 @@
 package org.apache.activemq.artemis.core.config.storage;
 
 import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executor;
 
 import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
 import org.apache.activemq.artemis.core.config.StoreConfiguration;
@@ -24,9 +27,6 @@ import org.apache.activemq.artemis.jdbc.store.drivers.JDBCConnectionProvider;
 import org.apache.activemq.artemis.jdbc.store.drivers.JDBCDataSourceUtils;
 import org.apache.activemq.artemis.jdbc.store.sql.SQLProvider;
 
-import java.util.HashMap;
-import java.util.Map;
-
 public class DatabaseStorageConfiguration implements StoreConfiguration {
 
    private String messageTableName = ActiveMQDefaultConfiguration.getDefaultMessageTableName();
@@ -183,6 +183,19 @@ public class DatabaseStorageConfiguration implements StoreConfiguration {
       }
       return connectionProvider;
    }
+
+   public DatabaseStorageConfiguration setConnectionProviderNetworkTimeout(Executor executor, int ms) {
+      getConnectionProvider().setNetworkTimeout(executor, ms);
+      return this;
+   }
+
+   public DatabaseStorageConfiguration clearConnectionProviderNetworkTimeout() {
+      if (connectionProvider != null) {
+         connectionProvider.setNetworkTimeout(null, -1);
+      }
+      return this;
+   }
+
    public void addDataSourceProperty(String key, String value) {
       if (value.toLowerCase().equals("true") || value.toLowerCase().equals("false")) {
          dataSourceProperties.put(key, Boolean.parseBoolean(value.toLowerCase()));
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index ad01a0e..23a4652 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -1746,7 +1746,6 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
             conf.addDataSourceProperty(propertyNode.getAttributeNode("key").getValue(), propertyNode.getAttributeNode("value").getValue());
          }
       }
-      //conf.initDataSource();
 
       return conf;
    }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java
index fc9b3a2..1ab90c0 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java
@@ -57,10 +57,6 @@ public class JDBCJournalStorageManager extends JournalStorageManager {
       try {
          final DatabaseStorageConfiguration dbConf = (DatabaseStorageConfiguration) config.getStoreConfiguration();
          final JDBCConnectionProvider connectionProvider = dbConf.getConnectionProvider();
-         final int networkTimeout = dbConf.getJdbcNetworkTimeout();
-         if (networkTimeout >= 0) {
-            connectionProvider.setNetworkTimeout(executorFactory.getExecutor(), networkTimeout);
-         }
          final JDBCJournalImpl bindingsJournal;
          final JDBCJournalImpl messageJournal;
          final JDBCSequentialFileFactory largeMessagesFactory;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 0fc6944..2ef94f8 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -490,6 +490,24 @@ public class ActiveMQServerImpl implements ActiveMQServer {
       return this;
    }
 
+   private void configureJdbcNetworkTimeout() {
+      if (configuration.isPersistenceEnabled()) {
+         if (configuration.getStoreConfiguration() != null && configuration.getStoreConfiguration().getStoreType() == StoreConfiguration.StoreType.DATABASE) {
+            DatabaseStorageConfiguration databaseStorageConfiguration = (DatabaseStorageConfiguration) configuration.getStoreConfiguration();
+            databaseStorageConfiguration.setConnectionProviderNetworkTimeout(threadPool, databaseStorageConfiguration.getJdbcNetworkTimeout());
+         }
+      }
+   }
+
+   private void clearJdbcNetworkTimeout() {
+      if (configuration.isPersistenceEnabled()) {
+         if (configuration.getStoreConfiguration() != null && configuration.getStoreConfiguration().getStoreType() == StoreConfiguration.StoreType.DATABASE) {
+            DatabaseStorageConfiguration databaseStorageConfiguration = (DatabaseStorageConfiguration) configuration.getStoreConfiguration();
+            databaseStorageConfiguration.clearConnectionProviderNetworkTimeout();
+         }
+      }
+   }
+
    /*
     * Can be overridden for tests
     */
@@ -581,6 +599,9 @@ public class ActiveMQServerImpl implements ActiveMQServer {
       try {
          checkJournalDirectory();
 
+         // this would create the connection provider while setting the JDBC global network timeout
+         configureJdbcNetworkTimeout();
+
          nodeManager = createNodeManager(configuration.getNodeManagerLockLocation(), false);
 
          nodeManager.start();
@@ -1220,16 +1241,10 @@ public class ActiveMQServerImpl implements ActiveMQServer {
          securitySettingPlugin.stop();
       }
 
-      if (threadPool != null && !threadPoolSupplied) {
-         shutdownPool(threadPool);
-      }
-
       if (ioExecutorPool != null) {
          shutdownPool(ioExecutorPool);
       }
 
-      if (!threadPoolSupplied)
-         threadPool = null;
       if (!scheduledPoolSupplied)
          scheduledPool = null;
 
@@ -1268,6 +1283,19 @@ public class ActiveMQServerImpl implements ActiveMQServer {
          }
       }
 
+      // JDBC journal can use this thread pool to configure the network timeout on a pooled connection:
+      // better to stop it after closing activation (and JDBC node manager on it)
+      final ExecutorService threadPool = this.threadPool;
+      if (threadPool != null && !threadPoolSupplied) {
+         shutdownPool(threadPool);
+      }
+      if (!threadPoolSupplied) {
+         this.threadPool = null;
+      }
+
+      // given that threadPool can be garbage collected, need to clear anything that would make it leaks
+      clearJdbcNetworkTimeout();
+
       if (activationThread != null) {
          try {
             activationThread.join(30000);
diff --git a/pom.xml b/pom.xml
index f7eeec3..a5ba712 100644
--- a/pom.xml
+++ b/pom.xml
@@ -87,6 +87,7 @@
       <activemq5-version>5.14.5</activemq5-version>
       <apache.derby.version>10.11.1.1</apache.derby.version>
       <commons.beanutils.version>1.9.4</commons.beanutils.version>
+      <commons.dbcp2.version>2.7.0</commons.dbcp2.version>
       <commons.collections.version>3.2.2</commons.collections.version>
       <commons.text.version>1.8</commons.text.version>
       <fuse.mqtt.client.version>1.16</fuse.mqtt.client.version>
@@ -751,7 +752,16 @@
          <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-dbcp2</artifactId>
-            <version>2.1.1</version>
+            <version>${commons.dbcp2.version}</version>
+            <!-- license Apache 2 -->
+         </dependency>
+         <!-- used by commons-dbcp2 -->
+         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+            <version>${commons.dbcp2.version}</version>
+            <!-- license Apache 2 -->
+            <scope>runtime</scope>
          </dependency>
 
          <!-- Needed for Micrometer -->
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jdbc/store/journal/JDBCJournalTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jdbc/store/journal/JDBCJournalTest.java
index 0215953..7403151 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jdbc/store/journal/JDBCJournalTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jdbc/store/journal/JDBCJournalTest.java
@@ -116,6 +116,8 @@ public class JDBCJournalTest extends ActiveMQTestBase {
       if (useAuthentication) {
          System.setProperty("derby.connection.requireAuthentication", "true");
          System.setProperty("derby.user." + getJdbcUser(), getJdbcPassword());
+         dbConf.setJdbcUser(getJdbcUser());
+         dbConf.setJdbcPassword(getJdbcPassword());
       }
       sqlProvider = JDBCUtils.getSQLProvider(
          dbConf.getJdbcDriverClassName(),