diff --git a/docs/connect/ado-net/appcontext-switches.md b/docs/connect/ado-net/appcontext-switches.md index 75de9e9465a..87651c8c422 100644 --- a/docs/connect/ado-net/appcontext-switches.md +++ b/docs/connect/ado-net/appcontext-switches.md @@ -4,7 +4,7 @@ description: Learn about the AppContext switches available in SqlClient and how author: dlevy-msft-sql ms.author: dlevy ms.reviewer: davidengel, paulmedynski, cmalhotra -ms.date: 08/11/2026 +ms.date: 08/24/2026 ms.service: sql ms.subservice: connectivity ms.topic: concept-article @@ -22,6 +22,8 @@ ai-usage: ai-assisted The AppContext class allows SqlClient to provide new functionality while continuing to support callers who depend on the previous behavior. Users can opt out of a change in behavior by setting specific AppContext switches. +SqlClient reads and caches each switch the first time it uses that switch. Set switches at application startup, before you use any SqlClient types. Changing a switch after SqlClient has cached its value has no effect. + ## Enable MultiSubnetFailover by default [!INCLUDE [dotnet-all](../../includes/products/applies-plain/dotnet-all.md)] @@ -208,6 +210,56 @@ Upon failover, failover partner information provided by the server is preferred AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.IgnoreServerProvidedFailoverPartner", true); ``` +## Enforce the connection idle timeout + +[!INCLUDE [dotnet-all](../../includes/products/applies-plain/dotnet-all.md)] + +Starting in version 7.1.0-preview2, the `Connection Idle Timeout` connection string keyword configures the idle duration, in seconds, after which a pooled connection becomes eligible for eviction (default 300; a value of 0 disables idle expiration). An eligible connection is discarded on a later retrieval or maintenance pass, so the exact timing can vary by pool implementation and maintenance cadence. The keyword is only enforced when the legacy idle-timeout behavior is disabled. With the switch at its default value of `true`, the pool preserves the historical behavior and the keyword has no effect. + +```csharp +AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseLegacyIdleTimeoutBehavior", false); +``` + +## Enable the V2 connection pool + +[!INCLUDE [dotnet-all](../../includes/products/applies-plain/dotnet-all.md)] + +Starting in version 6.1, SqlClient includes an alternative, experimental connection pool implementation (V2). The V1 pool remains the default (the switch defaults to `false`). To opt in to the V2 pool, enable the AppContext switch `Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2` at application startup. + +```csharp +AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2", true); +``` + +## Count pool waits against the connect timeout + +[!INCLUDE [dotnet-all](../../includes/products/applies-plain/dotnet-all.md)] + +Starting in version 7.1.0-preview2, time spent waiting for a connection from the pool can be counted against the caller's `Connect Timeout` budget, so pool waits and the network connection attempt share one overall timeout. When the switch is at its default value of `false`, pool operations receive a full `Connect Timeout` and the network connection attempt receives a further full budget. + +```csharp +AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseOverallConnectTimeoutForPoolWait", true); +``` + +## Revert to legacy failover alternation on login errors + +[!INCLUDE [dotnet-all](../../includes/products/applies-plain/dotnet-all.md)] + +Starting in version 7.1.0-preview2, when connecting with failover configured, SqlClient no longer alternates to the failover partner for SQL errors returned during the login phase. To revert to the legacy alternation behavior, enable the AppContext switch `Switch.Microsoft.Data.SqlClient.UseLegacyFailoverAlternationOnLoginSqlErrors` at application startup. The switch defaults to `false`. + +```csharp +AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseLegacyFailoverAlternationOnLoginSqlErrors", true); +``` + +## Honor an explicit zero scale on vartime parameters + +[!INCLUDE [dotnet-all](../../includes/products/applies-plain/dotnet-all.md)] + +By default, SqlClient sends a scale of 7 when you explicitly set the scale to 0 for **datetime2**, **datetimeoffset**, or **time** parameters. With version 6.0 and later versions, set `Switch.Microsoft.Data.SqlClient.LegacyVarTimeZeroScaleBehaviour` to `false` at application startup to preserve the explicit scale of 0. The switch defaults to `true`. + +```csharp +AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.LegacyVarTimeZeroScaleBehaviour", false); +``` + ## Related content - [AppContext Class](/dotnet/api/system.appcontext?view=netcore-3.1&preserve-view=true)