@@ -421,40 +421,48 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
421421 if (key .numChannels != null ) {
422422 builder .setNumChannels (key .numChannels );
423423 }
424- // Configure Dynamic Channel Pooling (DCP) if enabled .
424+ // Configure Dynamic Channel Pooling (DCP) based on explicit user setting .
425425 // Note: Setting numChannels disables DCP even if enableDynamicChannelPool is true.
426- if (Boolean .TRUE .equals (key .enableDynamicChannelPool ) && key .numChannels == null ) {
427- builder .enableDynamicChannelPool ();
428- // Build custom GcpChannelPoolOptions if any DCP-specific options are set.
429- if (key .dcpMinChannels != null
430- || key .dcpMaxChannels != null
431- || key .dcpInitialChannels != null ) {
432- // Build GcpChannelPoolOptions from scratch with custom values or Spanner defaults.
433- int minChannels =
434- key .dcpMinChannels != null
435- ? key .dcpMinChannels
436- : SpannerOptions .DEFAULT_DYNAMIC_POOL_MIN_CHANNELS ;
437- int maxChannels =
438- key .dcpMaxChannels != null
439- ? key .dcpMaxChannels
440- : SpannerOptions .DEFAULT_DYNAMIC_POOL_MAX_CHANNELS ;
441- int initChannels =
442- key .dcpInitialChannels != null
443- ? key .dcpInitialChannels
444- : SpannerOptions .DEFAULT_DYNAMIC_POOL_INITIAL_SIZE ;
445- GcpChannelPoolOptions poolOptions =
446- GcpChannelPoolOptions .newBuilder ()
447- .setMinSize (minChannels )
448- .setMaxSize (maxChannels )
449- .setInitSize (initChannels )
450- .setDynamicScaling (
451- SpannerOptions .DEFAULT_DYNAMIC_POOL_MIN_RPC ,
452- SpannerOptions .DEFAULT_DYNAMIC_POOL_MAX_RPC ,
453- SpannerOptions .DEFAULT_DYNAMIC_POOL_SCALE_DOWN_INTERVAL )
454- .setAffinityKeyLifetime (SpannerOptions .DEFAULT_DYNAMIC_POOL_AFFINITY_KEY_LIFETIME )
455- .setCleanupInterval (SpannerOptions .DEFAULT_DYNAMIC_POOL_CLEANUP_INTERVAL )
456- .build ();
457- builder .setGcpChannelPoolOptions (poolOptions );
426+ if (key .enableDynamicChannelPool != null && key .numChannels == null ) {
427+ if (Boolean .TRUE .equals (key .enableDynamicChannelPool )) {
428+ builder .enableDynamicChannelPool ();
429+ // Build custom GcpChannelPoolOptions if any DCP-specific options are set.
430+ if (key .dcpMinChannels != null
431+ || key .dcpMaxChannels != null
432+ || key .dcpInitialChannels != null ) {
433+ // Build GcpChannelPoolOptions from scratch with custom values or Spanner defaults.
434+ // Note: GcpChannelPoolOptions does not have a toBuilder() method, so we must
435+ // construct from scratch using SpannerOptions defaults for unspecified values.
436+ int minChannels =
437+ key .dcpMinChannels != null
438+ ? key .dcpMinChannels
439+ : SpannerOptions .DEFAULT_DYNAMIC_POOL_MIN_CHANNELS ;
440+ int maxChannels =
441+ key .dcpMaxChannels != null
442+ ? key .dcpMaxChannels
443+ : SpannerOptions .DEFAULT_DYNAMIC_POOL_MAX_CHANNELS ;
444+ int initChannels =
445+ key .dcpInitialChannels != null
446+ ? key .dcpInitialChannels
447+ : SpannerOptions .DEFAULT_DYNAMIC_POOL_INITIAL_SIZE ;
448+ GcpChannelPoolOptions poolOptions =
449+ GcpChannelPoolOptions .newBuilder ()
450+ .setMinSize (minChannels )
451+ .setMaxSize (maxChannels )
452+ .setInitSize (initChannels )
453+ .setDynamicScaling (
454+ SpannerOptions .DEFAULT_DYNAMIC_POOL_MIN_RPC ,
455+ SpannerOptions .DEFAULT_DYNAMIC_POOL_MAX_RPC ,
456+ SpannerOptions .DEFAULT_DYNAMIC_POOL_SCALE_DOWN_INTERVAL )
457+ .setAffinityKeyLifetime (SpannerOptions .DEFAULT_DYNAMIC_POOL_AFFINITY_KEY_LIFETIME )
458+ .setCleanupInterval (SpannerOptions .DEFAULT_DYNAMIC_POOL_CLEANUP_INTERVAL )
459+ .build ();
460+ builder .setGcpChannelPoolOptions (poolOptions );
461+ }
462+ } else {
463+ // Explicitly disable DCP when enableDynamicChannelPool=false.
464+ // This ensures consistent behavior even if the default changes in the future.
465+ builder .disableDynamicChannelPool ();
458466 }
459467 }
460468 if (options .getChannelProvider () != null ) {
0 commit comments