Ошибка Laravel DB Max Connections генерируется дважды в одном запросе GET - PullRequest
0 голосов
/ 11 октября 2018

У меня есть проект в производстве, сделанный с Laravel 5.4 на AWS, с EC2 и RDS (с автоматическим масштабированием).В обычный день наша текущая конфигурация не имеет проблем с обработкой определенного количества пользователей, но иногда это количество пользователей растет достаточно, чтобы начать генерировать эту ошибку Max Connections DB [1040], даже если мы настроили автоматическое масштабирование, чтобы избежать этого(Я думаю, что реплика требует достаточно времени для запуска, пока у нас все еще есть пользователи, пытающиеся получить к ней доступ).

Итак, в файле Handler.php мы поместили этот код, чтобы показать пользовательскую страницу, информирующую пользователя о проблеме (а не только общие сообщения!)

if ($e instanceof \PDOException) {
        Log::error('Data Base Exception');
        $errCode = $e->getCode();
        switch ($errCode) {
            case 1040:
                return response()->view("errors.database", []);
                break;
            default:
                return response()->view("errors.500", [], 500);
                break;

        }

    }

Проблема в том, что, по-видимому, laravel открывает более 1 соединения одновременно, даже если это всего лишь один запрос GET (это происходит с любым запросом на проекте), поэтому Handler.php сообщать об этом дважды.Вот посмотрите на файл журнала, сгенерированный при создании этого исключения.

[2018-10-11 14:04:09] production.ERROR: Data Base Exception  
[2018-10-11 14:04:09] production.ERROR: Data Base Exception

Я проверил это в своей локальной среде, установив атрибут max_connections из mysql в 1

set global max_connections = 1;

Thisвыдает исключение в соответствии с намерением, но HTML-страница с информацией о проблеме также появляется дважды, как журнал.

html с ошибкой для пользователя

Любопытновещь: когда я устанавливаю max_connections atributte равным 2, исключение не генерируется и laravel обрабатывает запрос нормально.

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

Вопрос в том, что делает Laravel, которому нужно 2 соединения, даже когда только один пользователь пытается получить доступ?Или, может быть, это связано с попыткой переподключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...