DBIx :: что-то, что может восстановить переменные сеанса при переподключении? - PullRequest
3 голосов
/ 03 июня 2019

Обычный обработчик DBI :: db потеряет все настройки сеанса базы данных, которые были выполнены с помощью $ dbh-> do ('SET variable_name = value').

Существует ли какой-либо DBIx :: * класс / пакет или так далее, который предоставляет метод, подобный "set_session", для установки переменных сеанса и может восстанавливать эти переменные после обнаружения потери соединения (тайм-аут соединения в 90% реальных случаев)?

Может выглядеть так:

# inside the user code:
$dbh->set(variable => 'string', yet_another_variable => 42)

# inside the DBIx::* package:
sub reconnect {
# ...
  while (my ($var, $val) = each %{$self->saved_vars}) {
    $self->dbh->do("SET $var=?", {}, $val)
  }
# ...
}

1 Ответ

3 голосов
/ 03 июня 2019

DBI поддерживает то, что называется Обратные вызовы .Я не могу ссылаться на этот бит документа, так как раздел довольно длинный, поэтому здесь он дословно.

Более распространенным приложением для обратных вызовов является установка состояния соединения только при создании нового соединения(с помощью connect () или connect_cached ()).Добавление обратного вызова к подключенному методу (при использовании connect) или через connect_cached.connected (при использовании connect_cached ()>) делает это легко.Метод connected () по умолчанию не используется (если вы не наследуете DBI и не меняете его).DBI вызывает его, чтобы указать, что установлено новое соединение и все атрибуты соединения установлены.Вы можете дать ему немного дополнительной функциональности, применив к нему обратный вызов.Например, чтобы убедиться, что MySQL понимает ANSI-совместимый SQL вашего приложения, настройте его следующим образом:

my $dbh = DBI->connect($dsn, $username, $auth, {
    Callbacks => {
        connected => sub {
            shift->do(q{
                SET SESSION sql_mode='ansi,strict_trans_tables,no_auto_value_on_zero';
            });
            return;
        },
    }
});

Это ваш точный вариант использования, который я считаю.Сделайте это вместо того, чтобы запускать собственный код после подключения.

...