ExecuteReader с MultiShardConnection в Azure неожиданно больше не возвращает записей - PullRequest
0 голосов
/ 11 июля 2019

Мы работаем в Azure с ElasticPool с 137 базами данных. Мы используем осколочный механизм. Добавление или удаление базы данных по-прежнему работает нормально. Но поиск во всех базах данных больше не работает.

Я создал код несколько лет назад, он не очень часто используется, но он работал. На прошлой неделе пользователь сообщил, что больше не возвращает результаты поиска.

Я попытался отладить, но не вижу ничего плохого. Когда я запускаю запрос непосредственно в SSMS в одной из баз данных сегмента, я получаю результаты.

Вот мой класс Shard с соответствующими частями:

// Constructor
public Sharding()
{
    _server = ConfigurationManager.AppSettings["SqlServer"];
    var shardManagement = ConfigurationManager.AppSettings["ShardManagement"];
    _userName = ConfigurationManager.AppSettings["UserName"];
    _password = ConfigurationManager.AppSettings["Password"];
    _applicationName = ConfigurationManager.AppSettings["ApplicationName"];

    var connStrBldr = new SqlConnectionStringBuilder
    {
        UserID = _userName,
        Password = _password,
        ApplicationName = _applicationName,
        DataSource = _server,
        InitialCatalog = shardManagement,
        MultipleActiveResultSets = true,
        MaxPoolSize = 500,
        Pooling = true,
        ConnectTimeout = connectionTimeOut
    };

    ShardMapManager = !ShardMapManagerFactory.TryGetSqlShardMapManager(connStrBldr.ConnectionString, ShardMapManagerLoadPolicy.Lazy, out var smm)
            ? ShardMapManagerFactory.CreateSqlShardMapManager(connStrBldr.ConnectionString)
            : smm;

    ShardMap = !ShardMapManager.TryGetListShardMap("MyClients", out ListShardMap<int> sm) ? ShardMapManager.CreateListShardMap<int>("MyClients") : sm;
}

public IList<MultiShardSearchResults> SearchUsingMultiShardQuery(string query)
{
    var resultList = new List<MultiShardSearchResults>();
    var connStrBldr = new SqlConnectionStringBuilder
    {
        IntegratedSecurity = false,
        UserID = _userName,
        Password = _password,
        Encrypt = true,
        TrustServerCertificate = false,
        ConnectTimeout = connectionTimeOut,
        ApplicationName = _applicationName,
        MultipleActiveResultSets = true,
        MaxPoolSize = 500,
        Pooling = true,
    };

    using (var conn = new MultiShardConnection(
                            ShardMap.GetShards(),
                            connStrBldr.ConnectionString))
    {
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = query;
            cmd.CommandType = CommandType.Text;
            cmd.ExecutionOptions = MultiShardExecutionOptions.IncludeShardNameColumn;
            cmd.ExecutionPolicy = MultiShardExecutionPolicy.PartialResults;
            cmd.CommandTimeoutPerShard = 60;

            using (var sdr = cmd.ExecuteReader())
            {
                Debug.WriteLine("HasRows: " + sdr.HasRows);  <-- Always false
                while (sdr.Read())
                {
                    var result = new MultiShardSearchResults();
                    if (!sdr.IsDBNull(0)) result.CorporateEntityName = sdr.GetString(0);
                    if (!sdr.IsDBNull(1)) result.EmployeeName = sdr.GetString(1);
                    if (!sdr.IsDBNull(2)) result.Street = sdr.GetString(2);
                    if (!sdr.IsDBNull(3)) result.ZipCity = sdr.GetString(3);
                    if (!sdr.IsDBNull(4)) result.PhoneNumber = sdr.GetString(4);
                    if (!sdr.IsDBNull(5)) result.DatabaseName = sdr.GetString(5);
                    resultList.Add(result);
                }
            }
        }
    }
    return resultList;
}

Пример запроса:

SELECT ent.Name
, ISNULL(e.Initials,'') + ' ' + ISNULL(e.Prefix, '') + ' ' + ISNULL(e.Surname, '') FullName
FROM [dbo].[Employees] e
join [dbo].[Addresses] a on a.Id = e.Id
join [dbo].[CorporateEntityEmployees] ee on ee.Employee_Id = e.Id
join [dbo].[CorporateEntities] ent on ent.Id = ee.CorporateEntity_Id
left join [dbo].[EmployementPeriods] ep on ep.[EmployeeId] = e.Id and ep.JobTitle is not null 
WHERE e.Surname = 'gates' ORDER BY ent.Name, e.Surname, e.BirthDate

Поскольку Azure печально известен своими критическими изменениями, мне интересно, в этом ли проблема. Конечно, я провел поиск с помощью Google и посмотрел на сайт Microsoft, но все примеры, которые я смог найти, похожи на мои.

...