This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 8a6f2da fix(java)!: require supplying BufferAllocator to create
drivers (#622)
8a6f2da is described below
commit 8a6f2da3e0aaa1163d488964d1a2da977c300331
Author: David Li <[email protected]>
AuthorDate: Fri Apr 28 16:09:34 2023 +0900
fix(java)!: require supplying BufferAllocator to create drivers (#622)
The old way was prone to memory leaks.
Fixes #563.
BREAKING CHANGE: removes static driver instances.
---
.../adbc/drivermanager/AdbcDriverManager.java | 22 ++++++++++++++++------
.../adbc/driver/flightsql/FlightSqlDriver.java | 9 +--------
.../apache/arrow/adbc/driver/jdbc/JdbcDriver.java | 9 ++-------
3 files changed, 19 insertions(+), 21 deletions(-)
diff --git
a/java/driver-manager/src/main/java/org/apache/arrow/adbc/drivermanager/AdbcDriverManager.java
b/java/driver-manager/src/main/java/org/apache/arrow/adbc/drivermanager/AdbcDriverManager.java
index 06cf5f9..a490082 100644
---
a/java/driver-manager/src/main/java/org/apache/arrow/adbc/drivermanager/AdbcDriverManager.java
+++
b/java/driver-manager/src/main/java/org/apache/arrow/adbc/drivermanager/AdbcDriverManager.java
@@ -20,15 +20,23 @@ package org.apache.arrow.adbc.drivermanager;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
import org.apache.arrow.adbc.core.AdbcDatabase;
import org.apache.arrow.adbc.core.AdbcDriver;
import org.apache.arrow.adbc.core.AdbcException;
import org.apache.arrow.adbc.core.AdbcStatusCode;
+import org.apache.arrow.memory.BufferAllocator;
+/**
+ * Load an ADBC driver based on name.
+ *
+ * <p>This class is EXPERIMENTAL. It will be rewritten before 1.0.0 (see <a
+ * href="https://github.com/apache/arrow-adbc/issues/48">issue #48</a>).
+ */
public final class AdbcDriverManager {
private static final AdbcDriverManager INSTANCE = new AdbcDriverManager();
- private final ConcurrentMap<String, AdbcDriver> drivers;
+ private final ConcurrentMap<String, Function<BufferAllocator, AdbcDriver>>
drivers;
public AdbcDriverManager() {
drivers = new ConcurrentHashMap<>();
@@ -38,18 +46,20 @@ public final class AdbcDriverManager {
* Connect to a database.
*
* @param driverName The driver to use.
+ * @param allocator The allocator to use.
* @param parameters Parameters for the driver.
* @return The AdbcDatabase instance.
* @throws AdbcException if the driver was not found or if connection fails.
*/
- public AdbcDatabase connect(String driverName, Map<String, Object>
parameters)
+ public AdbcDatabase connect(
+ String driverName, BufferAllocator allocator, Map<String, Object>
parameters)
throws AdbcException {
- final AdbcDriver driver = lookupDriver(driverName);
+ final Function<BufferAllocator, AdbcDriver> driver =
lookupDriver(driverName);
if (driver == null) {
throw new AdbcException(
"Driver not found for '" + driverName + "'", null,
AdbcStatusCode.NOT_FOUND, null, 0);
}
- return driver.open(parameters);
+ return driver.apply(allocator).open(parameters);
}
/**
@@ -58,11 +68,11 @@ public final class AdbcDriverManager {
* @param driverName The driver to lookup.
* @return The driver instance, or null if not found.
*/
- public AdbcDriver lookupDriver(String driverName) {
+ public Function<BufferAllocator, AdbcDriver> lookupDriver(String driverName)
{
return drivers.get(driverName);
}
- public void registerDriver(String driverName, AdbcDriver driver) {
+ public void registerDriver(String driverName, Function<BufferAllocator,
AdbcDriver> driver) {
if (drivers.putIfAbsent(driverName, driver) != null) {
throw new IllegalStateException(
"[DriverManager] Driver already registered for '" + driverName +
"'");
diff --git
a/java/driver/flight-sql/src/main/java/org/apache/arrow/adbc/driver/flightsql/FlightSqlDriver.java
b/java/driver/flight-sql/src/main/java/org/apache/arrow/adbc/driver/flightsql/FlightSqlDriver.java
index 324fdea..30fc460 100644
---
a/java/driver/flight-sql/src/main/java/org/apache/arrow/adbc/driver/flightsql/FlightSqlDriver.java
+++
b/java/driver/flight-sql/src/main/java/org/apache/arrow/adbc/driver/flightsql/FlightSqlDriver.java
@@ -26,24 +26,17 @@ import
org.apache.arrow.adbc.drivermanager.AdbcDriverManager;
import org.apache.arrow.adbc.sql.SqlQuirks;
import org.apache.arrow.flight.Location;
import org.apache.arrow.memory.BufferAllocator;
-import org.apache.arrow.memory.RootAllocator;
import org.apache.arrow.util.Preconditions;
/** An ADBC driver wrapping Arrow Flight SQL. */
public class FlightSqlDriver implements AdbcDriver {
- public static final FlightSqlDriver INSTANCE = new FlightSqlDriver();
-
static {
AdbcDriverManager.getInstance()
- .registerDriver("org.apache.arrow.adbc.driver.flightsql", INSTANCE);
+ .registerDriver("org.apache.arrow.adbc.driver.flightsql",
FlightSqlDriver::new);
}
private final BufferAllocator allocator;
- FlightSqlDriver() {
- this(new RootAllocator());
- }
-
FlightSqlDriver(BufferAllocator allocator) {
this.allocator = Objects.requireNonNull(allocator);
}
diff --git
a/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcDriver.java
b/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcDriver.java
index 2e30cb9..71e0d12 100644
---
a/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcDriver.java
+++
b/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcDriver.java
@@ -26,11 +26,9 @@ import org.apache.arrow.adbc.core.AdbcException;
import org.apache.arrow.adbc.drivermanager.AdbcDriverManager;
import org.apache.arrow.adbc.sql.SqlQuirks;
import org.apache.arrow.memory.BufferAllocator;
-import org.apache.arrow.memory.RootAllocator;
/** An ADBC driver wrapping the JDBC API. */
public class JdbcDriver implements AdbcDriver {
- public static final JdbcDriver INSTANCE = new JdbcDriver();
/** A parameter for creating an {@link AdbcDatabase} from a {@link
DataSource}. */
public static final String PARAM_DATASOURCE = "adbc.jdbc.datasource";
/**
@@ -41,15 +39,12 @@ public class JdbcDriver implements AdbcDriver {
public static final String PARAM_URI = "uri";
static {
-
AdbcDriverManager.getInstance().registerDriver("org.apache.arrow.adbc.driver.jdbc",
INSTANCE);
+ AdbcDriverManager.getInstance()
+ .registerDriver("org.apache.arrow.adbc.driver.jdbc", JdbcDriver::new);
}
private final BufferAllocator allocator;
- public JdbcDriver() {
- this(new RootAllocator());
- }
-
public JdbcDriver(BufferAllocator allocator) {
this.allocator = Objects.requireNonNull(allocator);
}