Сетевое ядро ​​DbContextPool против AddDbContextPool и более - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь использовать очередь 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, а также кэшировать их.Я все равно настроил бы параметры для повторных попыток, но опять же, эти таймауты будут возникать по внешним причинам, а не потому, что мой код создает сотни экземпляров, которые все пытаются сохранить крошечные сообщения в базу данных.

1 Ответ

0 голосов
/ 01 декабря 2018

Я не смог установить область для переходного процесса, не смог найти синтаксис!Есть ли один?

Нет, очевидно, потому что время жизни DbContexts контролируется кешем.

Получаемое сообщение об ошибке вызвано доступом к одному и тому же экземпляру DbContext из нескольких потоков, посколькуКласс DbContext не является потокобезопасным.Фактически это означает, что ваш пул DbContext не работает должным образом, возможно потому, что вы не создаете область при потреблении сообщения из своей очереди сообщений, следовательно, экземпляр DbContext используется несколькими потоками.Эта область создается под прикрытием в MVC, когда поступает HTTP-запрос, но в приложении другого типа вы должны создать его самостоятельно.

Обратите внимание, что между пулами DbContext и пулами соединений также есть разница.Если вам когда-нибудь понадобится контролировать количество соединений из вашего приложения, вам следует использовать пул соединений.

Как решить эту проблему?

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

...