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

Reply via email to