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 <[email protected]>
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"})