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..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 @@ -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() + .setKeepAliveTimeDuration(java.time.Duration.ofSeconds(10)) + .setKeepAliveTimeoutDuration(java.time.Duration.ofSeconds(5)) + .setKeepAliveWithoutCalls(true) + .build(); } + bigQueryReadSettings.setTransportChannelProvider(activeProvider); + return BigQueryReadClient.create(bigQueryReadSettings.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 22f98af07..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 @@ -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; @@ -340,4 +343,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(java.time.Duration.ofSeconds(10), grpcProvider.getKeepAliveTimeDuration()); + assertEquals(java.time.Duration.ofSeconds(5), grpcProvider.getKeepAliveTimeoutDuration()); + assertTrue(grpcProvider.getKeepAliveWithoutCalls()); + } + } }