【问题标题】:Perl Modules - Sharing Database ConnectionPerl 模块 - 共享数据库连接
【发布时间】:2013-04-21 05:31:22
【问题描述】:

在不同 .pm 文件中的“对象”之间共享 $dbh 变量时,有人能给我一些指导吗?

例如,我的主模块说 Foo.pm 有一个新的构造函数等,我可以给它一个 dbh 或创建一个 dbh,然后通过将它作为参数传递给 Bar.pm 的新构造函数来共享它,并且然后在 Bar->new 中重新分配,但这似乎我正在做很多工作来管理这个变量。

这是一种简单而优雅的方法吗?我研究了 Exporter 和其他一些示例,但似乎没有一个是直截了当的。

谢谢!

【问题讨论】:

  • 重新设计您的模块。您应该只有 一个 写入数据库。
  • 考虑 DBIx::Connector。您的主应用程序可以实例化一个连接器对象,并可以将其提供给应用程序使用的类。连接器对象可以共享一个连接,或者在现有连接失效时启动一个新连接。这是我在完整的 Mojolicious 应用程序中处理数据库交互的方法之一。
  • 尝试单例模式。您可以自己编写或尝试使用 CPAN 中的 Singleton 基类。
  • @Borodin,你是对的,那个模块叫做DBI。如果那不是您所指的那个,那么您的陈述太强烈以至于不真实。在某些情况下,在 DB 和您的业务逻辑之间设置一个层是一种很好的做法(然后您最好确实有 一个 这样的层),但并非在所有情况下,甚至在大多数情况下,我会说。 有不止一种方法可以做到这一点,你知道的。

标签: perl perl-module dbi


【解决方案1】:

我想您真正想要的是从与它一起工作的代码中控制 $dbh 创建。最简单的方法是,嗯,

my $dbh;
sub get_dbh {
    if ( $dbh is bad ) {
       reconnect or whatever
    }

    return $dbh || die;
}

然后在你的代码中访问它

get_dbh()->do("your sql");

您可以将 get_dbh() 函数放到一个单独的模块中,然后从项目中的任何位置调用它 - 与 perl 一样,它只会被包含一次,并且它的局部静态变量 $dbh 将只存在于perl 进程。

有许多可能的方法来实现这一点,编写一个如上所述的函数(并且可能传递对该函数的引用而不是传递 $dbh)就是其中之一。还有很多其他的,取决于你的设计和个人喜好——一个单例类,一个与上述函数相关的变量,甚至是一个模仿 DBI 的类......这取决于你,但应该是一个 一段代码,在你的项目中传播这个逻辑是个坏主意。

【讨论】:

    【解决方案2】:

    如果您使用Moose 来构建您的对象,您可以将您的数据库句柄封装在role 中,并要求将其放入需要访问数据库的类中。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2011-07-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      相关资源
      最近更新 更多