Запросы EFCore ограничены 1000 при многократных запросах в ASP.NET - PullRequest
1 голос
/ 02 мая 2019

Я заметил, что мое приложение ASP.NET, которое импортирует CSV-файлы и превращает их в объекты БД, значительно замедлило процесс импорта.

Информация о версии: EFCore 2.2.3, .NET Core 2.0

Казалось, что он застревает при запросе базы данных для строки CSV, чтобы проверить, существует ли уже сущность. Что странно, так это то, что до этого момента все в порядке, и он останавливается на почти ровно 1000 запросов, каждый раз. После этого происходит разброс журналов, указывающих, что потоки завершаются, затем обрабатывается еще одна кучка, снова останавливается, промывается и повторяется.

Я исследовал различные теории, в конце концов я свел его к этому примеру (на самом деле он работает в своем собственном потоке, но для упрощения примера я переместил его в метод контроллера):

Startup.cs

...
// We use an extended DbContext that defines the various DbSets as usual
services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(dbConnectionString));
...

SomeController.cs

private readonly DatabaseContext _context;

public SomeController(DatabaseContext context) 
{
    _context = context;
}

[Route("/SomeController/TestQueries")]
public async Task<JsonResult> TestQueries()
{
    await TestRepeatedQueries();
    return null;
}

private async Task TestRepeatedQueries()
{
    for (var i = 0; i < 10000; i++)
    {
        Debug.WriteLine($"Fetching for iteration {i}");
        _ = await _context.SomeTable.FirstOrDefaultAsync(); // Nothing fancy
        // It doesn't appear that table complexity is a factor
        // The problem occurs even with a simple table with an ID and a few integers
    }
}

При попадании в метод контроллера, журналы показывают, что он весело запускается, запрашивая БД около 1000 итераций, но затем просто останавливается. Кажется, что некоторые случайные рабочие потоки завершаются, и, может быть, через 5 секунд или около того, он проходит еще ~ 10 итераций, и так далее, и так далее.

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

По любым вопросам, пожалуйста, обращайтесь!

Обновление

По какой-то неизвестной причине, он просто снова начал работать правильно - единственное, что я сделал, - переключился на другую ветку, чтобы продолжить работу, и открыл еще одну копию проекта, чтобы проверить вещи, как я думал о них. Как только я запустил пример кода, он прошел все 10000 итераций без проблем.

Это не объясняет, что вызвало проблему и как ее воспроизвести, но мне кажется, что где-то есть кеширование / буферизация запросов, которые, возможно, заполнились?

1 Ответ

0 голосов
/ 02 мая 2019

Я запутался, это связано с отслеживанием сущностей.См .: https://docs.microsoft.com/en-us/ef/core/querying/tracking.await _context.SomeTable.AsNoTracking().FirstOrDefaultAsync(); должно помочь.Я попал в эту конкретную ситуацию, делая сложный импорт.Структуры сущностей треков слишком сильно растут.Другой подход - ограничить количество операций DBContex экземплярами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...