«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2020/05/13 12:44:11  №1686679 1
Аноны, может кто поможет. У меня трабла с нодой, но в сущности и с пхп получается. Суть такова:

Короче разобрался. Все упирается в ошибку 'Error: Too many connections' - слишком много соединений с базой.
Использую mysql2, с пулом коннектов равным 10.

И теперь объясните пожалуйсто мне дауну как правильно работать с базой данных?

Очевидно что нормальные приложения не зависают к хуям после 10 запросов к базе данных. Приложения поддерживают тысячи пользователей одномоментно, и от этих пользователей идет множество запросов к базе данных. И все это работает.

Означает ли пул в 10 коннектов то что в не более 10 запросов одномоментно в sql базе может исполняться? И что остальные запросы ждут пока эти 10 исполнятся где ждут? самому очередь формировать??
У меня ошибку 'Error: Too many connections' выдает даже если я просто рефрешу страницу - там простой код который несколько статей из базы достает. Неужели я где то так обосрался что эти мои простенькие sql запросы где то в базе залипают? Я вроде соединение освободжаю в коде.

Очевидно я дебил , но объясните как это должно нормально работать?
Ощущение у меня что я люто обосрался по фундаментальному пониманию. На пхп тоже есть пет проект. В нем я с данной ошибкой не сталкивался. Но возможно просто потому что и не нагрузил его нормально. PDO само освобождает соединение по выполнению скрипта. Но логика таже? Не более, допустим 10 коннектов к базе?

Где почитать как пхп взаимодействует с базой под нагрузкой, и как база под нагрузкой работает?


Ответы: >>1686774 >>1686919
Аноним 2020/05/13 13:24:30  №1686774 2
>>1686679

В СУБД есть ограничение на число одновременно сделанных соединений. Либо у тебя этот лимит очень маленький (меньше, чем размер пула), либо ты неправильно реализовал пул, он создает постоянно новые соединения, не закрывая, и упирается в лимит.

Пул (правильно реализованный) нужен для 2 целей:

- не тратить время на установку соединения, а взять готовое из пула
- защитить БД от перегрузки, притормозив бекенд, если все соединения в пуле заняты

Есть у пула и недостатки. Если кто-то вернет в пул соединение в неправильном состоянии (например, с открытой транзакцией), то будут баги.

В PHP пул обычно не исопльзуют и создают новое соединение при старте скрипта и закрывают по завершении.

Ответы: >>1686932
Аноним 2020/05/13 14:59:38  №1686919 3
>>1686679
Тут дело не столько в самом пуле, сколько именно в работе ноды. Пхп однопоточный, и когда ты делаешь запросы через PDO ты всегда будешь использовать одно соединение, даже если есть пул.
А вот нода асинхронная и многопоточная, так что когда ты вызываешь запросы в цикле они выполняются параллельно, используя все доступные соединения из пула.
Например пул на десять соединений, ты делаешь двадцать запросов в пхп. Берется одно соединение и запросы выстраиваются в очередь на использование этого соединения. Ты делаешь двадцать запросов в ноде. На каждый запрос берется соединение, а кому не досталось становятся в очередь и ждут, когда соединение освободится.
Но это не объясняет откуда у тебя ошибка 'Error: Too many connections'. Возникнуть она может если твой пул больше доступного в MySQL количества соединений. Выполни запрос SHOW VARIABLES LIKE 'max_connections'; и посмотри че там по количеству. Дальше сам решай уменьшить пул или увеличить значение в MySQL.
И еще. Выполнение запросов в цикле это хуевая тема, хоть нода и делает их параллельно. Если тебе нужен список, то получай его одним запросом, а не по одной записи.
Ответы: >>1686932 >>1686977
Аноним 2020/05/13 15:08:48  №1686932 4
>>1686774
>>1686919

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

>>SHOW VARIABLES LIKE 'max_connections'
Это проверял.
>>Выполнение запросов в цикле это хуевая тема
Нет, sql запросы конечно не в цикле.
Ответы: >>1686937
Аноним 2020/05/13 15:10:09  №1686937 5
>>1686932
>>на каждый обработчик
на каждый вызов обработчика роута
самофикс