За последние 24 часа нас посетили 17746 программистов и 1652 робота. Сейчас ищут 852 программиста ...

Как ограничить количество подключений к базе?

Тема в разделе "MySQL", создана пользователем pkraven, 20 окт 2014.

  1. pkraven

    pkraven Новичок

    С нами с:
    14 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    Уже долго бьюсь над этой проблемой и никак не получается решить.

    Есть около 100 параллельно работающих парсеров, каждый парсер работает где-то минут 20 при этом он с некоторой периодичностью подключается к базе, чтобы занести туда инфу.
    Так как 'max_user_connections' на сервере установлено - 10, надо постоянно подключаться и отключаться от базы, тоесть как-то регулировать можно ли скрипту соединяться с базой или ждать пока это соединение освободится.

    Так вот как узнать сколько уже есть соединений с базой? Или какой другой способ, чтобы не было превышения max_user_connections?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. pkraven

    pkraven Новичок

    С нами с:
    14 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    У меня и есть VPS. Проблема в том что одновременных подключений может быть и 100 и 1000, а это критично для базы
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    костыль: делаем текстовый файлик. перед подключением и после завершения занесения данных - пытаемся заблокировать файлик монопольно. если блок есть - открываем файлик и читаем из него число. если мы завершаемся - декремент значения, запись, снятие блокоровки. если мы пытаемся подключиться - сравниваем число с лимитом. если "можно" - инкремент числа, запись, снятие блокировки. если "нельзя" то уж сами думайте что будет парсер делать пока ему нельзя сбросить данные.
    конец костыля.

    а еще при подключении получать код ошибки. если это 1040 или 1203 значит превышен общий лимит сервера или юзера соответственно. что с этим делать - решайте сами.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а в чем проблема держать все нужные подключения?
     
  6. pkraven

    pkraven Новичок

    С нами с:
    14 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    Делал так:
    Код (Text):
    1. Connect
    2.  
    3. $pid=file_get_contents(dirname(__FILE__)."/base_status");
    4. if ($pid=='0' or (!empty($pid) and posix_kill($pid,0)==false))
    5. {
    6.     file_put_contents(dirname(__FILE__)."/base_status",getmypid());
    7.     $base=mysql_connect(HOST_NAME, DB_USER_NAME, PASSWORD);
    8. }
    9.  
    10. Close
    11.  
    12. if (mysql_close($base)==true)
    13. {
    14.     file_put_contents(dirname(__FILE__)."/base_status","0");
    15. }
    Но все-равно через какое-то время идет превышение max_user_connections, возможно в какой-то момент идет одновременное чтение base_status (а там 0). С блоком может быть такая же штука, или может я не правильно понял этот вариант? Можно кусок кода в пример?

    я не знаю как определить сколько максимально подключений может быть к базе, поэтому боюсь что база ляжет
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    методом научного тыка
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы внимательно читали мое сообщение???

    вам какого? костыля?
     
  9. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Выше Вам сказали - обрабатывайте ошибку при подключении. Движок SQL очень быстро отрабатывает такое и малозатратно, так что Вам вряд ли удастся положить базу (конечно, если Вы не будете делать десятки-сотни тысяч подключений в секунду / сервер ;) ).
    А дальше всё просто/стандартно - отловили ошибку и ждёте N секунд для следующей попытки. Если и в следующий раз не пускает, то (=N*K) и т.д., пока не "вклинится". Остальное - по желанию/необходимости.
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    лимит по конектам в 10 это чушь.
    Ваш вопрос о том как равести костёр не наколов дров или как быть сытым без еды.
    Даже лимит конектов в 30 это ничтожно мало и выставляется в основом на площадках виртуального хостинга. А для чего лимит в 10 конектов на VDS не представляю. Для работы пары клиентов СУБД хватило бы, а вы там воркеров гоняете.
    Если вы полагаете что СУБД "ложится" от количества подключений, - удивлю, но это не так. Сами по себе подключения генерируют минимальную нагрузку которая не сравнима с активностью подключений, то есть с выполнением операций по их запросам, которые просто встают в очередь.
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Поспорю - открытие коннекта стоит довольно дорого. В своем масштабе. Но не настолько, чтобы "много коннектов могут положить базу". Не могут. База для того и база, чтобы к ней коннектились и слали запросы. Это ее буквальное предазначение. Чтобы описать масштабы дороговизны открытия коннектов, то это как 1 копейка и 5 копеек. 5 копеек в 5 раз дороже одной и, несомненно весома. Но не при покупке мерседеса.
    Поддержу - 10 коннектов это смешно. У вас VDS поднят на телефоне чтоль, которому лет 10?