Skip to content

Commit

Permalink
Avoid sql connection timeout (#1414)
Browse files Browse the repository at this point in the history
* Creat TVP prior to opening sql connection

Data Table creation is slow. connection may be timing out while we create it.

* USe MARS-enabled connections to fix connection issue

dotnet/SqlClient#54
(cherry picked from commit 9841502)
  • Loading branch information
MGibson1 committed Jun 25, 2021
1 parent 8ec9a50 commit 87d6bfa
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions src/Core/Repositories/SqlServer/OrganizationUserRepository.cs
Expand Up @@ -16,9 +16,22 @@ namespace Bit.Core.Repositories.SqlServer
{
public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IOrganizationUserRepository
{
/// <summary>
/// For use with methods with TDS stream issues.
/// This has been observed in Linux-hosted SqlServers with large table-valued-parameters
/// https://github.com/dotnet/SqlClient/issues/54
/// </summary>
private string _marsConnectionString;

public OrganizationUserRepository(GlobalSettings globalSettings)
: this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString)
{ }
{
var builder = new SqlConnectionStringBuilder(ConnectionString)
{
MultipleActiveResultSets = true,
};
_marsConnectionString = builder.ToString();
}

public OrganizationUserRepository(string connectionString, string readOnlyConnectionString)
: base(connectionString, readOnlyConnectionString)
Expand Down Expand Up @@ -80,7 +93,7 @@ public async Task<int> GetCountByOrganizationAsync(Guid organizationId, string e
bool onlyRegisteredUsers)
{
var emailsTvp = emails.ToArrayTVP("Email");
using (var connection = new SqlConnection(ConnectionString))
using (var connection = new SqlConnection(_marsConnectionString))
{
var result = await connection.QueryAsync<string>(
"[dbo].[OrganizationUser_SelectKnownEmails]",
Expand Down Expand Up @@ -344,7 +357,7 @@ public async Task CreateManyAsync(IEnumerable<OrganizationUser> organizationUser
}

var orgUsersTVP = organizationUsers.ToTvp();
using (var connection = new SqlConnection(ConnectionString))
using (var connection = new SqlConnection(_marsConnectionString))
{
var results = await connection.ExecuteAsync(
$"[{Schema}].[{Table}_CreateMany]",
Expand All @@ -361,7 +374,7 @@ public async Task ReplaceManyAsync(IEnumerable<OrganizationUser> organizationUse
}

var orgUsersTVP = organizationUsers.ToTvp();
using (var connection = new SqlConnection(ConnectionString))
using (var connection = new SqlConnection(_marsConnectionString))
{
var results = await connection.ExecuteAsync(
$"[{Schema}].[{Table}_UpdateMany]",
Expand Down

0 comments on commit 87d6bfa

Please sign in to comment.