4

У меня есть база данных Azure, которая ограничена 60 параллельными соединениями. Моя проблема заключается в том, что у меня есть несколько сканеров, которые заполняют эту базу данных, которая будет использоваться нашим сайтом с использованием Entity Framework.Ограничение доступа к базе данных с платформой Entity Framework C#

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

Я мог бы обернуть DbContext в одноэлементном режиме, но тогда я бы ограничил весь искатель одним соединением.

Есть ли другие способы достижения этого?

+0

Какую версию EF вы используете? В сочетании с вашим «Max Pool Size = 60;» в вашей строке соединения вы устанавливаете «Pooling = true;»? * (хотя в любом случае значение 'true' должно быть значением по умолчанию) * –

+0

Вы не освобождаете свое соединение после того, как закончите с ним? –

+0

@GeoffJames Да Объединение установлено в true. Я попытался установить Max Pool Size = 1; чтобы узнать, могу ли я ограничить соединения. Тем не менее, он по-прежнему создает больше соединений по мере необходимости. В настоящее время я использую EF 6.1.3. Я попробовал Core, но группа по проблеме делает ее совершенно непригодной. – mscard02

ответ

4

Вы пытаетесь ограничить одновременный доступ к общему ресурсу. Обычно для этого используется Semaphore.

Чтобы сделать это через один ящик или одно приложение, которое вы могли бы использовать Semaphore or SemaphoreSlim

Однако если клиенты работают на разных коробках естественное место для размещения семафор будет сам SQL Server. См. this article для одного из способов его реализации. Приложению потребуется вызвать proc для получения блокировки перед доступом к базе данных с помощью DbContext. Предел семафора должен быть равен 59, чтобы сохранить одно соединение для чтения семафора.

Смежные вопросы