【问题标题】:DBIx::something that can restore session variables on reconnection?dbix ::可以在重新连接上恢复会话变量的东西?
【发布时间】:2019-10-19 05:02:30
【问题描述】:

普通 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)
  }
# ...
}

【问题讨论】:

  • 推荐使用像DBIx::Connector这样的连接管理器或Mojo::Pg家族的东西,因为它会在需要和分叉时重新连接——你可以不用担心共享连接器对象,并检索句柄需要的时候。使用这些时,您可以使用相同的 DBI 回调或 connection event 来设置每个新连接。
  • @Grinnz ,使用 DBIx::SQLEngine 代替 DBIx::Connector 怎么样。看起来,DBIx::SQLEngine 中也实现了重连,但比 Connector 使用起来更简单
  • 对我来说它看起来要复杂得多,而且年代久远。如果你想要一个也可以作为连接管理器的 ORM,理想的选择是DBIx::Class

标签: perl dbi


【解决方案1】:

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

回调的一个更常见的应用是设置连接状态 仅在建立新连接时(通过 connect() 或 connect_cached())。 添加回调到连接的方法(使用连接时)或通过 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;
        },
    }
});

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

【讨论】:

  • 谢谢!太好了:不需要在堆栈中使用一些额外的包,钩住DBI“已连接”回调就足够了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多