Достигнуто максимальное значение пула

343
03 мая 2017, 07:26

Подскажите пожалуйста, как решить вопрос с соединением. Использую базу данных MySQL, в программе к ней куча различных запросов. В какой то момент выводит сообщение:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

Не знаю как быть, очень надеюсь на ваш опыт и помощь

Answer 1

Примерный перевод ошибки:

Истек тайм-аут. Период ожидания получения свободного соединения из пула. Эта проблема может проявляться потому что все подключения в пуле в данный момент заняты и достигнут максимальный размер пула.

Если вы получаете такое сообщение, для начала надо проверить, не забываете ли вы освобождать используемые подключения к БД. Проверьте, что все подключения освобождаются либо через using, либо через явный вызов .Close(). Если используется явный вызов Close - убедитесь так же, что ваша программа всегда доходит до этой строчки.

Если вы все проверили но ошибка все еще возникает - значит, вы и правда используете слишком много соединений с БД либо держите их слишком долго. Вот что можно попробовать:

  1. Не держите соединения долго, по возможности создавайте отдельное на каждую операцию. Помните, что создание соединения с БД в C# - очень дешевая операция, потому что на самом деле оно берется из пула.

  2. Если вы используете фоновые задачи для доступа к БД - проверьте, что вы не создаете их слишком много.

    Так, если вы в цикле запрашиваете какие-то данные из БД - убедитесь что прошлый вопрос успел отработать к тому времени когда вы делаете следующий.

    Если вы просто делаете много фоновых запросов к БД - организуйте очереди запросов, и обрабатывайте их фиксированным числом обработчиков. Или используйте библиотеку TPL Dataflow, которая умеет ограничивать степень параллельности.

  3. Если ничего не помогает - можно просто увеличить максимальное число соединений в пуле. Это делается настройкой maximumpoolsize=... в строке соединения (скорее всего, я не знаю какой драйвер вы используете). Более подробно параметры строки соединения можно увидеть в документации на используемый вами драйвер или на сайте https://www.connectionstrings.com/

PS этот ответ актуален для любых СУБД, не только для MySQL

READ ALSO
Отправка письма php фоном

Отправка письма php фоном

Задача следующаяНужно по нажатию кнопки на странице, собрать все заполненные пользователем поля и отправить их на конкретный email, при этом...

470
Кодировка в PHP ООП

Кодировка в PHP ООП

Ребята, изучаю курс PHP ООП Lyndacom Кевина Скогланда

377
Чем задокументировать фреймворк?

Чем задокументировать фреймворк?

есть некий php фреймворк, без документацииНеобходимо описать функционирование, классы, методы

293
SoundCloud embedded

SoundCloud embedded

How to make it embedded? Like a player, not a link

391