Skip to content

Spice Java SDK v0.6.0

Latest

Choose a tag to compare

@phillipleblanc phillipleblanc released this 26 Mar 13:54
· 1 commit to trunk since this release
1380a8f

Highlights

This release focuses on transport resilience and dependency upgrades. A new reset() method provides manual recovery from stuck transport connections, gRPC keep-alive detects dead connections early, and DNS re-resolution enables automatic recovery from load-balancer IP rotation.

What's New

🔄 Connection Reset

The SDK now supports a reset() method for manual transport recovery. When the underlying gRPC connection becomes permanently stuck (e.g. TLS handshake to a wrong backend, persistent UNAVAILABLE after retries), reset() discards the bad connection and immediately establishes a fresh one:

SpiceClient client = SpiceClient.builder()
    .withApiKey(API_KEY)
    .withSpiceCloud()
    .build();

try {
    try (FlightStream stream = client.query(sql)) {
        // process results...
    }
} catch (ExecutionException e) {
    if (isTransportFailure(e.getCause())) {
        client.reset();   // discard bad transport, reconnect immediately
        try (FlightStream stream = client.query(sql)) {
            // process results with fresh connection...
        }
    } else {
        throw e;
    }
}

Key behaviors:

  • Thread-safe (synchronized) — concurrent reset calls are serialized
  • Idempotent — safe to call multiple times
  • Throws IllegalStateException if client is already closed
  • Resets both Flight and ADBC connections

🏥 gRPC Keep-Alive

HTTP/2 keep-alive pings are now enabled by default to detect dead connections quickly:

  • Keep-alive interval: 30 seconds
  • Keep-alive timeout: 10 seconds
  • Keep-alive without calls: enabled (pings even when idle)

🌐 DNS Re-Resolution

The SDK now uses dns:/// target resolution for gRPC channels, enabling periodic hostname re-resolution. This allows clients to automatically recover from load-balancer IP rotation (e.g. AWS NLB) without manual intervention.

DNS cache TTL: For more aggressive DNS refresh (recommended for cloud-deployed clients), set the JVM property:

-Dnetworkaddress.cache.ttl=30

🛡️ Lazy Transport Recovery

A new ensureFlightClient() safety net automatically rebuilds the Flight client if the internal reference is null at query time, adding an extra layer of resilience.

⬆️ Updated Dependencies

Dependency Previous Current
Apache Arrow Flight SQL 18.3.0 19.0.0
Apache Arrow ADBC Driver Flight SQL 0.21.0 0.22.0
Apache Arrow ADBC Core 0.21.0 0.22.0
Gson 2.13.1 2.13.2
Netty 4.1.130.Final 4.2.12.Final

🔧 Updated Build Plugins

Plugin Previous Current
maven-surefire-plugin 3.5.4 3.5.5
maven-source-plugin 3.3.1 3.4.0
central-publishing-maven-plugin 0.9.0 0.10.0
spotbugs-maven-plugin 4.9.3.0 4.9.8.2
dependency-check-maven 12.1.1 12.2.0
jacoco-maven-plugin 0.8.13 0.8.14
maven-enforcer-plugin 3.5.0 3.6.2