Каков наилучший способ обработки «Предупреждение: mysql_connect (): слишком много соединений» с Kohana 3? - PullRequest
1 голос
/ 16 ноября 2010

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

Многие люди часто входят в систему сразу.

Приложение работает на общем хосте.

Я иногда получаю ...

Предупреждение: mysql_connect () [function.mysql-connect]: слишком много соединений

Который затем позволяет дальнейшим каскадным ошибкам ... подобно ошибкам с mysql_select_db(), mysql_error(), mysql_errnon() и, наконец, необработанным Database_Eexception.

Когда я запускаю свой основной запрос, я заключаю его в try, фиксирую любое исключение и отображаю страницу not found . Это потому, что обычно мои контроллеры выдают исключения, если ресурс не найден (хотя маршрут может быть действительным), например http://example.com/products/30 является допустимым маршрутом, но продукт № 30 не существует.

Как лучше всего справиться с слишком большим количеством соединений ? В идеале я бы хотел зафиксировать это исключение отдельно, а затем отобразить красивую страницу, которая сообщает сотруднику о необходимости повторить попытку через 5 минут.

Код, который запускает мой основной запрос в application/bootstrap.php, выглядит следующим образом ...

$request = Request::instance();

try {
    $request->execute();
} catch (Exception $e) {

    if (Kohana::$environment === Kohana::DEVELOPMENT) throw $e;

    // Log the error
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

    // Create a 404 response
    $request->status = 404;
    $request->response = Request::factory(Route::get('catch_all')->uri(array('path' => 'errors/404')))->execute();
}

$request->send_headers();
echo $request->response;

Спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 16 ноября 2010

Я только что создал такой файл для обработки всех ошибок:

<?php

class Kohana extends Kohana_Core
{
  /**
   * Redirect to custom exception_handler
   */
  public static function exception_handler(Exception $e)
  {
    if (Kohana::DEVELOPMENT === Kohana::$environment)
    {
      // Pass to Kohana if we're in the development environment
      parent::exception_handler($e);
    }
    else
    {
      Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

      // Default route
      $route = Route::url('default', array('controller' => 'error', 'action' => '404'));

      // Error sub-request.
      echo Request::factory($route)
        ->execute()
        ->send_headers()
        ->response;
    }
  }
}

Пока это всего лишь эскиз, но он может дать вам некоторые идеи.

ps: мой загрузчик не изменен

1 голос
/ 11 июня 2011

В /etc/my.cnf в разделе [mysqld] добавьте:

max_connections = 500

Затем либо выполните SET GLOBAL max_connections = 500; в MySQL, либо перезапустите MySQL.

1 голос
/ 16 ноября 2010

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

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

...