Perl模块-共享数据库连接

Perl模块-共享数据库连接,perl,perl-module,dbi,Perl,Perl Module,Dbi,有人能告诉我在不同的.pm文件中的“对象”之间共享$dbh变量的最佳方法吗 例如,我的主模块说Foo.pm有一个新的构造函数,等等,我可以给它一个dbh,或者创建一个dbh,然后通过将它作为参数传递给Bar.pm的新构造函数来共享它,然后在Bar->new中重新赋值,但这看起来好像我在管理这个变量方面做了很多工作 这是一种简单而优雅的方法吗?我研究过Exporter和其他几个例子,但没有一个是直接的 谢谢 如果要使用来构建对象,可以将数据库句柄封装在中,并要求将其放入需要数据库访问的类中。我想您

有人能告诉我在不同的.pm文件中的“对象”之间共享$dbh变量的最佳方法吗

例如,我的主模块说Foo.pm有一个新的构造函数,等等,我可以给它一个dbh,或者创建一个dbh,然后通过将它作为参数传递给Bar.pm的新构造函数来共享它,然后在Bar->new中重新赋值,但这看起来好像我在管理这个变量方面做了很多工作

这是一种简单而优雅的方法吗?我研究过Exporter和其他几个例子,但没有一个是直接的


谢谢

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

我想您真正想要的是从使用它的代码中控制$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的类。。。这取决于您,但这应该是一段代码,将此逻辑传播到您的项目中是一个坏主意。

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