Сначала я не знал, связан ли мой вопрос с производительностью параллелизма, но сценарий заключается в том, что я хочу вставить некоторые события, поступающие с УАТС-сервера, и в зависимости от типа каждого события указать значение c столбца .
События происходят слишком быстро непрерывно, и продолжительность между двумя событиями может составлять около 0,017 с, как показано на скриншоте ниже из вставленных событий.
Приложение-слушатель разработано в ASP. NET 3.1, класс которого основан на. NET базовом классе фоновой службы, а DBContext
предоставляется Entity Framework Core 3.1.2.
In ExecuteAsync
метод прослушивателей событий были предоставлены. Поэтому в обработчике событий для вставки событий в базу данных я использую. NET Базовую область поставщика услуг для добавления необходимого репозитория.
using (var scope = _service.CreateScope())
{
var callStatRepo = scope.ServiceProvider.GetRequiredService<ICallStatRepository>();
var lastState = await callStatRepo.GetLastStateOfDevice(e.Channel.Name);
var callTypeSb = new StringBuilder();
if (lastState != null && String.Equals(lastState, "ANSWER",
StringComparison.CurrentCultureIgnoreCase))
{
callTypeSb.Append(CallType.OUTCALL.Value);
}
else if (lastState != null && String.Equals(lastState, "InboundStarts",
StringComparison.CurrentCultureIgnoreCase))
{
callTypeSb.Append(CallType.INBOUND.Value);
}
await callStatRepo.InsertCallStat(new RawCallStatRegisterViewModel
{
HappenedAt = DateTime.Now,
Type = callTypeSb.ToString(),
Device = e.Channel.Name,
Number = e.Channel.Connected.Number,
State = e.Channel.State
});
callTypeSb.Clear();
}
public async Task InsertCallStat(RawCallStatRegisterViewModel model)
{
var rawCall = new DeviceState
{
HappenedAt = model.HappenedAt,
Type = model.Type,
Device = model.Device,
Number = model.Number,
State = model.State
};
_context.Entry(rawCall).State = EntityState.Added;
try
{
await _context.SaveChangesAsync();
}
catch (Exception e)
{
throw new Exception("Insert new call stat falis with this error : " + e.Message);
}
}
Проблема заключается в заполнении столбца «Тип» на основе последнего предыдущего » Государственный'. Условие для заполнения «Тип» проверяет, было ли последнее предыдущее состояние «ОТВЕТ» или «Звон». Но иногда это невозможно выяснить, каким было последнее состояние, и оставляет столбец Тип пустым.
Я думаю, что эта проблема может быть связана с слишком быстрой вставкой записей, и я не знаю, как это можно решить. Могу ли я изменить тип базы данных на любой другой тип базы данных, например MongoDB? И может ли это быть правильным решением? Являются ли базы данных No- SQL быстрее, чем сервер SQL в параллельном режиме?