Мы работаем в 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, но все примеры, которые я смог найти, похожи на мои.