diff --git a/.github/instructions/features.instructions.md b/.github/instructions/features.instructions.md
index 34262b8db6..f7f5fe607a 100644
--- a/.github/instructions/features.instructions.md
+++ b/.github/instructions/features.instructions.md
@@ -254,7 +254,7 @@ AppContext switches allow runtime behavior changes without modifying connection
| `Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal` | `false` | Truncates scaled decimal values instead of rounding |
| `Switch.Microsoft.Data.SqlClient.UseCompatibilityAsyncBehaviour` | `false` | Uses legacy async behavior for compatibility |
| `Switch.Microsoft.Data.SqlClient.UseCompatibilityProcessSni` | `false` | Uses legacy SNI processing path |
-| `Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2` | `false` | Enables the new `ChannelDbConnectionPool` implementation |
+| `Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2` | `true` | Enables the new `ChannelDbConnectionPool` implementation; set to `false` to restore the legacy `WaitHandleDbConnectionPool` |
| `Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows` | `false` | Forces managed SNI on Windows (instead of native SNI) |
| `Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin` | `false` | Sets 1-second minimum in login timeout calculations |
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ConnectionPool/ChannelDbConnectionPool.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ConnectionPool/ChannelDbConnectionPool.cs
index a547ce0fd4..6cf6ab34cc 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ConnectionPool/ChannelDbConnectionPool.cs
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ConnectionPool/ChannelDbConnectionPool.cs
@@ -1046,9 +1046,11 @@ public bool TryGetConnection(
/// Opens a new internal connection to the database, throttled by the pool's rate limiter.
///
/// The owning connection.
- /// The cancellation token to cancel the operation.
/// The overall timeout budget. Passed through to the physical connection
/// so it uses the remaining budget rather than starting a fresh timeout.
+ /// An optional cancellation token used by background warmup.
+ /// Caller timeout cancellation is reserved for pool waits so physical connection failures
+ /// retain the same exception behavior as the legacy pool.
/// The new internal connection, or null if the pool has no available slot or the
/// rate limiter is currently saturated. In the latter case the caller should fall back to
/// the idle-channel wait; the rate limiter will write a null to the idle channel when a
@@ -1058,8 +1060,8 @@ public bool TryGetConnection(
///
private DbConnectionInternal? OpenNewInternalConnection(
DbConnection? owningConnection,
- CancellationToken cancellationToken,
- TimeoutTimer timeout)
+ TimeoutTimer timeout,
+ CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -1507,7 +1509,6 @@ private async Task GetInternalConnection(
// in either case the caller falls through to the idle-channel wait below.
connection ??= OpenNewInternalConnection(
owningConnection,
- cancellationToken,
timeout);
// If we're at max capacity and couldn't open a connection. Block on the idle channel with a
@@ -1939,8 +1940,8 @@ private async Task RunWarmupLoopAsync()
// saturated; a thrown exception means the physical open genuinely failed.
connection = OpenNewInternalConnection(
owningConnection: null,
- cancellationToken: token,
- timeout: timeout);
+ timeout: timeout,
+ cancellationToken: token);
}
catch (OperationCanceledException)
{
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/LocalAppContextSwitches.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/LocalAppContextSwitches.cs
index 06bf6c4f0e..269b74c97c 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/LocalAppContextSwitches.cs
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/LocalAppContextSwitches.cs
@@ -580,12 +580,12 @@ public static bool UseCompatibilityAsyncBehaviour
/// pool implementation. When set to false, the connection pool will use
/// the legacy V1 implementation.
///
- /// The default value of this switch is false.
+ /// The default value of this switch is true.
///
public static bool UseConnectionPoolV2 =>
AcquireAndReturn(
UseConnectionPoolV2String,
- defaultValue: false,
+ defaultValue: true,
ref s_useConnectionPoolV2);
///
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/ConnectionPoolTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/ConnectionPoolTest.cs
index a3ae028a5d..4ca10e4938 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/ConnectionPoolTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/ConnectionPoolTest.cs
@@ -57,6 +57,9 @@ public IEnumerator