Реконнект к БД (SQL)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Реконнект к БД (SQL)

Сообщение shkarbatov »

Всем привет.

Столкнулся как-то давненько с темой реконнекта к БД (SQL).

У меня есть воркер на yii2, который работает через commands, работает с БД он через персистентное соединение.
Через каждые 8 часов надо переподключаться к БД.

Так как запрос был всего один, я обернул в try catch запрос к БД, и если падает Exception, то надо переподключиться к БД.

Код: Выделить всё

Yii::$app->db->close();
Yii::$app->db->open();
Все бы ничего, только вот решение - костыльное, так как надо оборачивать запросы к БД.

Переопределить

Код: Выделить всё

yii2/vendor/yiisoft/yii2/db/Connection.php
protected function createPdoInstance()
тоже не вариант, так как это спасет от проблемы в момент подключения, а вот если надо будет переподключиться, то увы, до этого кода дело даже не дойдет, из-за вот этого:

https://github.com/yiisoft/yii2/blob/ma ... n.php#L521

Код: Выделить всё

if ($this->pdo !== null) {
    return;
}
Так как объект pdo у нас на тот момент уже будет.

Единственное решение которое я сейчас вижу, это переопределение

Код: Выделить всё

yii2/vendor/yiisoft/yii2/db/Command.php
protected function queryInternal($method, $fetchMode = null)
Оборачивание метода в try catch, переоткрытие соединения и запуск запроса еще раз.

Может у кого-то есть более цивилизованные способы?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Реконнект к БД (SQL)

Сообщение samdark »

shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: Реконнект к БД (SQL)

Сообщение shkarbatov »

Мне кажется это очень плохая идея.
Количество запросов увеличивается вдвое, а реально в моем случае, при персистентном соединении 1 на 1 000 000 запросов.

Работа с PDO должна строиться на Exception.

Более того $this->_instance это что?

Код: Выделить всё

if(!$this->isConnected()){
    \Yii::$app->db->close();
    \Yii::$app->db->open();
}

$this->pdoStatement->execute(); 
Разве это будет работать? Разве объект $this->pdoStatement не будет использоваться старый?
Ответить