Я пытаюсь использовать очередь Kafka с высокой скоростью обработки и сохранять результат в MySql, используя EF из .net core 2.1. Я пытался использовать и AddDbContext
, и AddDbContextPool
, и я столкнулся с проблемами в обоих сценариях..
1) При использовании AddDbContext
единственный способ, которым я был успешно, состоял в том, чтобы охватить его transient
, чтобы вы получали новый экземпляр DataContext
каждый раз, когда мне нужно вызвать вставку данных.Моя очередь большая, и у меня слишком много подключений к серверу mqSQL, поэтому в конечном итоге я получаю массу ошибок тайм-аута.
Я знаю, что могу добавить опции для повторных попыток при переходных ошибках (и тайм-аут является одним из них), но меня больше всего интересует, как уменьшить количество DataContext
экземпляров до числа, которое не будет забивать базу данных.Это привело меня к следующей попытке
2) При использовании AddDbContextPool
я не смог установить область действия на transient
, не смог найти синтаксис!Есть один?не имея возможности получать новый экземпляр для каждого вызова, я получаю еще одну породу странных ошибок, которые обычно решаются с кратковременной продолжительностью жизни
An attempt was made to use the context while it is being configured.
A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point.
This can happen if a second operation is started on this context before a previous operation completed.
Any instance members are not guaranteed to be thread safe.
Также, насколько я понимаю, параметр poolize в AddDbContextPool
просто устанавливает размер кэша для DbContext
объектов, которые будут использоваться повторно и никоим образом не препятствует количеству общих соединений.Мне бы очень хотелось, чтобы пул был насыщенным, чтобы иметь возможность блокировать следующий вызов get DBContext, пока не станет доступен один экземпляр.
Итак, мой вопрос к сообществу: как решить эту проблему?Я хотел бы уменьшить количество DbContext
экземпляров до фиксированного числа, например, 10, а также кэшировать их.Я все равно настроил бы параметры для повторных попыток, но опять же, эти таймауты будут возникать по внешним причинам, а не потому, что мой код создает сотни экземпляров, которые все пытаются сохранить крошечные сообщения в базу данных.