Connection Settings

Component: SQL Server Transport
NuGet Package NServiceBus.SqlServer (3.1)
Target NServiceBus Version: 6.x

Using connection pool

The SQL Server transport is built on top of ADO.NET and will use connection pooling. This may result in the connection pool being shared by the transport, as well as other parts of the endpoint process and the business logic.

In scenarios where the concurrent message processing limit is changed, or the database connection is used for other purposes as mentioned above, it is advisable to change the connection pool size to ensure it will not be exhausted. See also SQL Server Connection Pooling and Configuration.

If the maximum pool size is not explicitly set on the connection string a warning message will be logged. See also Tuning endpoint message processing

Connection configuration

Connection string can be configured in several ways:

Via the configuration API

By using the ConnectionString extension method:

var transport = endpointConfiguration.UseTransport<SqlServerTransport>();
transport.ConnectionString(
    "Data Source=INSTANCE_NAME;Initial Catalog=some_database;Integrated Security=True;Max Pool Size=80");

Via the App.Config

By adding a connection named NServiceBus/Transport in the connectionStrings node.

<configuration>
  <connectionStrings>
     <add name="NServiceBus/Transport"
          connectionString="Data Source=INSTANCE_NAME; Initial Catalog=some_database; Integrated Security=True;Max Pool Size=80"/>
  </connectionStrings>
</configuration>

Via a named connection string

By using the ConnectionStringName extension method:

var transport = endpointConfiguration.UseTransport<SqlServerTransport>();
transport.ConnectionStringName("MyConnectionString");

Combined this with a named connection in the connectionStrings node of the app.config file:

<configuration>
  <connectionStrings>
    <add name="MyConnectionString"
         connectionString="Data Source=INSTANCE_NAME; Initial Catalog=some_database; Integrated Security=True; Queue Schema=nsb; Max Pool Size=80"/>
  </connectionStrings>
</configuration>

Multiple connection strings

In multi-catalog and multi-instance modes additional configuration is required for proper message routing:

  • The sending endpoint needs to know the connection string of the receiving endpoint.
  • The replying endpoint needs to know the connection string of the originator of the message for which the reply is being sent
  • The subscribing endpoint needs to know the connection string of the publishing endpoint, in order to send subscription request.
  • The publishing endpoint needs to know the connection strings or all the subscribed endpoints

Connection strings for the remote endpoint can be configured using following API

var transport = endpointConfiguration.UseTransport<SqlServerTransport>();
transport.EnableLegacyMultiInstanceMode(async address =>
{
    var connectionString = address.Equals("RemoteEndpoint") ? "SomeConnectionString" : "SomeOtherConnectionString";
    var connection = new SqlConnection(connectionString);
    await connection.OpenAsync()
        .ConfigureAwait(false);
    return connection;
});
The address parameter passed to the callback above is a transport address. It conforms to the queue@[schema] convention, e.g. could be equal to MultiInstanceSender@[dbo].

Custom database schemas

SQL Server transport uses dbo as a default schema. Default schema is used for every queue if no other schema is explicitly provided in transport address. That includes all local queues, error, audit and remote queues of other endpoints.

The default schema can be overridden using DefaultSchema method:

var transport = endpointConfiguration.UseTransport<SqlServerTransport>();
transport.DefaultSchema("myschema");

Custom SQL Server transport connection factory

In some environments it might be necessary to adapt to database server settings, or to perform additional operations. For example, if the NOCOUNT setting is enabled on the server, then it is necessary to send the SET NOCOUNT OFF command right after opening the connection.

That can be done by passing the transport a custom factory method which will provide connection strings at runtime, and which can perform custom actions:

var transport = endpointConfiguration.UseTransport<SqlServerTransport>();
transport.UseCustomSqlConnectionFactory(
    sqlConnectionFactory: async () =>
    {
        var connection = new SqlConnection("SomeConnectionString");
        try
        {
            await connection.OpenAsync()
                .ConfigureAwait(false);

            // perform custom operations

            return connection;
        }
        catch
        {
            connection.Dispose();
            throw;
        }
    });
If opening the connection fails, the custom connection factory must dispose the connection object and rethrow the exception.

Circuit Breaker

The SQL transport has a built in circuit breaker to handle intermittent SQL Server connectivity problems.

Wait time

Overrides the default time to wait before triggering a circuit breaker that initiates the endpoint shutdown procedure in case of repeated critical errors.

The default value is 2 minutes.

var transport = endpointConfiguration.UseTransport<SqlServerTransport>();
transport.TimeToWaitBeforeTriggeringCircuitBreaker(TimeSpan.FromMinutes(3));

Last modified