2010-11-15 1 views
1

У меня есть веб-приложение, которое используется компанией для регистрации работы своих сотрудников.Каков наилучший способ обработки «Предупреждение: mysql_connect(): Слишком много соединений» с Kohana 3?

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

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

я иногда получить ...

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

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

Когда я запускаю свой основной запрос, я обертываю его в try и фиксирую любое исключение и отображаю не найден. Это связано с тем, что обычно мои контроллеры генерируют исключения, если ресурс не найден (хотя маршрут может быть действительным), например. 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; 

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

ответ

1

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

<?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; 
    } 
    } 
} 

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

пс: мой самозагрузки не модифицируется

+0

Может быть, вы должны использовать 'set_exception_handler()' вместо изменения логики основного ядра системы? Что-то вроде 'if (Kohana :: DEVELOPMENT! == Kohana :: $ environment) {set_exception_handler (array ('Kohana', 'exception_handler'));}' в bootstrap.php – biakaveron

+0

@biakaveron: по какой причине?Это статический полиморфизм, поэтому я только что преодолел метод. – zerkms

1

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

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

1

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

max_connections = 500 

Тогда либо выполнить SET GLOBAL max_connections = 500; в MySQL или перезапустить MySQL.