This is an automated email from the ASF dual-hosted git repository. tledkov pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new dab857a IGNITE-15508 Added loading via ServiceLoader for JDBC Driver (#355) dab857a is described below commit dab857aa62ec3672586e0184852af2b85e4225de Author: Vladimir Ermakov <85303706+vladermako...@users.noreply.github.com> AuthorDate: Thu Sep 30 11:50:11 2021 +0300 IGNITE-15508 Added loading via ServiceLoader for JDBC Driver (#355) --- .../org/apache/ignite/jdbc/IgniteJdbcDriver.java | 34 ++++++++++++---------- .../resources/META-INF/services/java.sql.Driver | 1 + .../runner/app/jdbc/AbstractJdbcSelfTest.java | 3 -- .../runner/app/jdbc/ITJdbcConnectionSelfTest.java | 22 ++++++++++++++ 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/modules/client/src/main/java/org/apache/ignite/jdbc/IgniteJdbcDriver.java b/modules/client/src/main/java/org/apache/ignite/jdbc/IgniteJdbcDriver.java index 0378307..b7ce8eb 100644 --- a/modules/client/src/main/java/org/apache/ignite/jdbc/IgniteJdbcDriver.java +++ b/modules/client/src/main/java/org/apache/ignite/jdbc/IgniteJdbcDriver.java @@ -32,18 +32,14 @@ import org.apache.ignite.internal.jdbc.JdbcConnection; import static org.apache.ignite.internal.jdbc.ConnectionPropertiesImpl.URL_PREFIX; /** - * JDBC driver thin implementation for In-Memory Data Grid. + * JDBC driver thin implementation for Apache Ignite 3.x. * <p> - * Driver allows to get distributed data from Ignite cache using standard - * SQL queries and standard JDBC API. It will automatically get only fields that - * you actually need from objects stored in cache. + * Driver allows to get distributed data from Ignite Data Storage using standard + * SQL queries and standard JDBC API. */ public class IgniteJdbcDriver implements Driver { /** Driver instance. */ - private static final Driver INSTANCE = new IgniteJdbcDriver(); - - /** Registered flag. */ - private static volatile boolean registered; + private static Driver instance; static { register(); @@ -107,18 +103,26 @@ public class IgniteJdbcDriver implements Driver { * @return Driver instance. * @throws RuntimeException when failed to register driver. */ - public static synchronized Driver register() { - try { - if (!registered) { - DriverManager.registerDriver(INSTANCE); + private static synchronized void register() { + if (isRegistered()) + throw new RuntimeException("Driver is already registered. It can only be registered once."); - registered = true; - } + try { + Driver registeredDriver = new IgniteJdbcDriver(); + DriverManager.registerDriver(registeredDriver); + IgniteJdbcDriver.instance = registeredDriver; } catch (SQLException e) { throw new RuntimeException("Failed to register Ignite JDBC driver.", e); } + } - return INSTANCE; + /** + * Checks if Driver is instantiated. + * + * @return {@code true} if the driver is registered against {@link DriverManager}. + */ + private static boolean isRegistered() { + return instance != null; } } diff --git a/modules/client/src/main/resources/META-INF/services/java.sql.Driver b/modules/client/src/main/resources/META-INF/services/java.sql.Driver new file mode 100644 index 0000000..3d89bc5 --- /dev/null +++ b/modules/client/src/main/resources/META-INF/services/java.sql.Driver @@ -0,0 +1 @@ +org.apache.ignite.jdbc.IgniteJdbcDriver diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/AbstractJdbcSelfTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/AbstractJdbcSelfTest.java index f00129b..6a5d618 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/AbstractJdbcSelfTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/AbstractJdbcSelfTest.java @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.List; import org.apache.ignite.app.Ignite; import org.apache.ignite.app.IgnitionManager; -import org.apache.ignite.jdbc.IgniteJdbcDriver; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.TestInfo; @@ -48,8 +47,6 @@ public class AbstractJdbcSelfTest { */ @BeforeAll public static void beforeAll(@TempDir Path temp, TestInfo testInfo) { - IgniteJdbcDriver.register(); - String nodeName = testNodeName(testInfo, 47500); String configStr = "node.metastorageNodes: [ \"" + nodeName + "\" ]"; diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcConnectionSelfTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcConnectionSelfTest.java index 003d9ae..833ae50 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcConnectionSelfTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcConnectionSelfTest.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.runner.app.jdbc; import java.sql.Connection; import java.sql.DatabaseMetaData; +import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -30,8 +31,10 @@ import java.sql.Savepoint; import java.sql.Statement; import java.util.HashMap; import java.util.Properties; +import java.util.ServiceLoader; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import org.apache.ignite.jdbc.IgniteJdbcDriver; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -61,6 +64,25 @@ import static org.junit.jupiter.api.Assertions.fail; @SuppressWarnings("ThrowableNotThrown") public class ITJdbcConnectionSelfTest extends AbstractJdbcSelfTest { /** + * Test JDBC loading via ServiceLoader + */ + @Test + public void testServiceLoader() { + ServiceLoader<Driver> sl = ServiceLoader.load(Driver.class); + + IgniteJdbcDriver igniteJdbcDriver = null; + + for (Driver driver : sl) { + if (driver instanceof IgniteJdbcDriver) { + igniteJdbcDriver = ((IgniteJdbcDriver)driver); + break; + } + } + + assertNotNull(igniteJdbcDriver); + } + + /** * @throws Exception If failed. */ @SuppressWarnings({"EmptyTryBlock", "unused"})