You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2026/08/07 11:59:52 UTC

(hop) branch main updated: Force driver load to avoid deadlocks, fixes #5698 (#7829)

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

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new e991658dc3 Force driver load to avoid deadlocks, fixes #5698 (#7829)
e991658dc3 is described below

commit e991658dc37a11087998f6eb97602f13ccd4afc3
Author: Hans Van Akelyen <ha...@gmail.com>
AuthorDate: Fri Aug 7 13:59:46 2026 +0200

    Force driver load to avoid deadlocks, fixes #5698 (#7829)
---
 .../src/main/java/org/apache/hop/core/database/Database.java | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/core/src/main/java/org/apache/hop/core/database/Database.java b/core/src/main/java/org/apache/hop/core/database/Database.java
index 0a5d73babd..b64ddc6b05 100644
--- a/core/src/main/java/org/apache/hop/core/database/Database.java
+++ b/core/src/main/java/org/apache/hop/core/database/Database.java
@@ -436,6 +436,18 @@ public class Database implements IVariables, ILoggingObject, AutoCloseable {
 
     try {
       synchronized (DriverManager.class) {
+        // Force the JDBC 4 driver ServiceLoader scan to run here, while we hold the lock.
+        //
+        // DriverManager only performs that scan once, lazily, the first time a connection is
+        // opened. It instantiates every java.sql.Driver on the classpath, not just the one we
+        // need. If that happens in DriverManager.getConnection() below, it runs unsynchronized
+        // with the driver class loading of another transform's init thread: both threads then
+        // initialize the same driver class hierarchy from opposite ends and deadlock on the
+        // class initialization monitors, hanging the pipeline. Doing it here makes the scan
+        // happen exactly once, single threaded, before any driver class can be initialized by
+        // another route.
+        DriverManager.getDrivers();
+
         ClassLoader classLoader = PluginRegistry.getInstance().getClassLoader(plugin);
         Class<?> driverClass = classLoader.loadClass(classname);