MySQL Entity Provider: "Слишком много соединений"

В нашем приложении ASP.NET мы реализовали слой данных, построенный поверх MySQL и использующий Connector/NET для реализации Entity Framework.

Это прекрасно работает для большинства наших действий CRUD, но когда мы выполняем оператор INSERT с несколькими сотнями записей, он выдает исключение "слишком много соединений".

Хотя я принимаю, что мы делаем много отдельных вызовов чтения / записи (мы запрашиваем дубликаты записей перед каждой вставкой, плюс есть журнал аудита, который также записывается с использованием отдельного запроса для каждой вставки), но не должен устанавливать соединение бассейн позаботится об этом?

Кроме того, в этом аналогичном потоке OP было сказано использовать операторы using, с которыми я полностью согласен, и в нашем случае каждый запрос уже заключен в оператор using, который, как я полагаю, эффективно управляет соединениями, т. Е. Не избавляется от их, если другой запрос был поставлен в очередь.

И вообще, connect timeout сейчас 50, что уже довольно мало, верно? Перемещение до 500 не имело значения, в то время как уменьшение до 10 дало мне примерно на 50% больше вставок, прежде чем было выдано то же исключение.

Итак, учитывая, что каждый экземпляр DbContext обернут в оператор использования, почему мы получаем исключение "Слишком много соединений"?

ОБНОВЛЕНИЕ: Мы обнаружили, что корень нашей проблемы на самом деле был вызван тем, что один из наших репозиториев открыл соединение с БД в своем конструкторе, хотя это соединение никогда не использовалось. Извините, ребята, это оказалась красная сельдь. Спасибо за ваши предложения.

2 ответа

Не совсем ответ, который вы ищете... но:

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

В качестве примера:

Если вы выполняете 50 вставок подряд и, как следствие, 50 запросов (по одному на каждую вставку), использующих одно и то же соединение, значительно улучшат производительность вашей системы.

Как насчет среднего исполнения вашей типичной вставки? Есть ли вероятность, что соединение для нового запроса вставки (со всеми подзапросами вокруг вставки) будет получено до того, как будет обработан предыдущий? Вы пытались профилировать / записать, как ваши функции вставки DAL выполняют во время этой большой нагрузки вставки? Иногда производительность (если это будет проблемой) может быть значительно улучшена путем перемещения части логики от "запросов на чистую сущность" к триггерам (ведение журнала аудита, см. Как программировать триггер MySQL для вставки строки в другую таблицу?) И хранимых процедур (запрос на дубликаты + вставки сами), так как у вас будет меньше обращений к серверу / больше контроля над вашими запросами.

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

Другие вопросы по тегам