DBIx ::某种可以在重新连接时恢复会话变量的东西吗?

时间:2019-06-03 15:55:53

标签: perl dbi

普通的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 个答案:

答案 0 :(得分:3)

DBI支持something called Callbacks。由于该部分很长,因此我无法链接到文档的这一部分,因此此处是逐字记录。

  

更常见的回调应用程序是设置连接状态   仅在建立新连接时(通过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;
        },
    }
});

我相信这是您的确切用例。在连接后执行此操作,而不是运行自己的代码。