From 1b139c3f52c78584225d11d96d03e2028c9e17cf Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 3 Feb 2026 19:28:38 +0000 Subject: [PATCH 1/5] feat(jdbc): enable gRPC Keep-Alive for Storage Read API --- .../bigquery/jdbc/BigQueryConnection.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index e93938f25..53f3061f4 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -18,6 +18,7 @@ import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.rpc.FixedHeaderProvider; import com.google.api.gax.rpc.HeaderProvider; @@ -1053,10 +1054,23 @@ private BigQueryReadClient getBigQueryReadClientConnection() throws IOException if (this.universeDomain != null) { bigQueryReadSettings.setUniverseDomain(this.universeDomain); } - if (this.transportChannelProvider != null) { - bigQueryReadSettings.setTransportChannelProvider(this.transportChannelProvider); + TransportChannelProvider activeProvider = this.transportChannelProvider; + if (activeProvider == null) { + activeProvider = BigQueryReadSettings.defaultGrpcTransportProviderBuilder().build(); + } + + if (activeProvider instanceof InstantiatingGrpcChannelProvider) { + activeProvider = + ((InstantiatingGrpcChannelProvider) activeProvider) + .toBuilder() + .setKeepAliveTime(org.threeten.bp.Duration.ofSeconds(10)) + .setKeepAliveTimeout(org.threeten.bp.Duration.ofSeconds(5)) + .setKeepAliveWithoutCalls(true) + .build(); } + bigQueryReadSettings.setTransportChannelProvider(activeProvider); + return BigQueryReadClient.create(bigQueryReadSettings.build()); } From 0d9ed089664aca7eb131f85d1787abb3b0bd70ae Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 3 Feb 2026 19:28:57 +0000 Subject: [PATCH 2/5] test(jdbc): add unit test for gRPC Keep-Alive configuration --- .../bigquery/jdbc/BigQueryConnectionTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 22f98af07..b98d9ea1f 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -18,8 +18,11 @@ import static org.junit.Assert.*; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.rpc.HeaderProvider; +import com.google.api.gax.rpc.TransportChannelProvider; import com.google.cloud.bigquery.exception.BigQueryJdbcException; +import com.google.cloud.bigquery.storage.v1.BigQueryReadClient; import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient; import java.io.IOException; import java.io.InputStream; @@ -30,6 +33,7 @@ import java.util.Properties; import org.junit.Before; import org.junit.Test; +import org.threeten.bp.Duration; public class BigQueryConnectionTest { @@ -340,4 +344,25 @@ public void testMetaDataFetchThreadCountProperty() throws SQLException, IOExcept connectionCustom.getMetadataFetchThreadCount()); } } + + @Test + public void testBigQueryReadClientKeepAliveSettings() throws SQLException, IOException { + String url = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "OAuthType=2;ProjectId=MyBigQueryProject;" + + "OAuthAccessToken=redactedToken;OAuthClientId=redactedToken;" + + "OAuthClientSecret=redactedToken;"; + try (BigQueryConnection connection = new BigQueryConnection(url)) { + BigQueryReadClient readClient = connection.getBigQueryReadClient(); + assertNotNull(readClient); + + TransportChannelProvider provider = readClient.getSettings().getTransportChannelProvider(); + assertTrue(provider instanceof InstantiatingGrpcChannelProvider); + + InstantiatingGrpcChannelProvider grpcProvider = (InstantiatingGrpcChannelProvider) provider; + assertEquals(Duration.ofSeconds(10), grpcProvider.getKeepAliveTime()); + assertEquals(Duration.ofSeconds(5), grpcProvider.getKeepAliveTimeout()); + assertTrue(grpcProvider.getKeepAliveWithoutCalls()); + } + } } From c3d8aa08e4cb843f15f34dbb4f54754f7d644725 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 3 Feb 2026 19:43:58 +0000 Subject: [PATCH 3/5] chore: fix dependency --- .../com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index b98d9ea1f..6f24af55f 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -27,13 +27,13 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; +import java.time.Duration; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Properties; import org.junit.Before; import org.junit.Test; -import org.threeten.bp.Duration; public class BigQueryConnectionTest { From 9b116bd8c676a2e744a6bbe0dc5e07e8d90be1cd Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 3 Feb 2026 19:56:20 +0000 Subject: [PATCH 4/5] fix: unit tests --- .../google/cloud/bigquery/jdbc/BigQueryConnectionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 6f24af55f..c8e15f692 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -360,8 +360,8 @@ public void testBigQueryReadClientKeepAliveSettings() throws SQLException, IOExc assertTrue(provider instanceof InstantiatingGrpcChannelProvider); InstantiatingGrpcChannelProvider grpcProvider = (InstantiatingGrpcChannelProvider) provider; - assertEquals(Duration.ofSeconds(10), grpcProvider.getKeepAliveTime()); - assertEquals(Duration.ofSeconds(5), grpcProvider.getKeepAliveTimeout()); + assertEquals(Duration.ofSeconds(10).toString(), grpcProvider.getKeepAliveTime().toString()); + assertEquals(Duration.ofSeconds(5).toString(), grpcProvider.getKeepAliveTimeout().toString()); assertTrue(grpcProvider.getKeepAliveWithoutCalls()); } } From 7051fdbe73ad715e30f508253ff01b456ff127f0 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 3 Feb 2026 20:35:10 +0000 Subject: [PATCH 5/5] fix: use `java.time.Duration` instead of `threetenbp` --- .../com/google/cloud/bigquery/jdbc/BigQueryConnection.java | 4 ++-- .../google/cloud/bigquery/jdbc/BigQueryConnectionTest.java | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 53f3061f4..188b3f9a8 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -1063,8 +1063,8 @@ private BigQueryReadClient getBigQueryReadClientConnection() throws IOException activeProvider = ((InstantiatingGrpcChannelProvider) activeProvider) .toBuilder() - .setKeepAliveTime(org.threeten.bp.Duration.ofSeconds(10)) - .setKeepAliveTimeout(org.threeten.bp.Duration.ofSeconds(5)) + .setKeepAliveTimeDuration(java.time.Duration.ofSeconds(10)) + .setKeepAliveTimeoutDuration(java.time.Duration.ofSeconds(5)) .setKeepAliveWithoutCalls(true) .build(); } diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index c8e15f692..6df4724b2 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -27,7 +27,6 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; -import java.time.Duration; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -360,8 +359,8 @@ public void testBigQueryReadClientKeepAliveSettings() throws SQLException, IOExc assertTrue(provider instanceof InstantiatingGrpcChannelProvider); InstantiatingGrpcChannelProvider grpcProvider = (InstantiatingGrpcChannelProvider) provider; - assertEquals(Duration.ofSeconds(10).toString(), grpcProvider.getKeepAliveTime().toString()); - assertEquals(Duration.ofSeconds(5).toString(), grpcProvider.getKeepAliveTimeout().toString()); + assertEquals(java.time.Duration.ofSeconds(10), grpcProvider.getKeepAliveTimeDuration()); + assertEquals(java.time.Duration.ofSeconds(5), grpcProvider.getKeepAliveTimeoutDuration()); assertTrue(grpcProvider.getKeepAliveWithoutCalls()); } }