【发布时间】:2018-10-22 14:34:01
【问题描述】:
我的应用程序结构如下:
/root_dir/lib/Mojo_App/Controller/Main.pm
/root_dir/lib/Mojo_App/Database/Db.pm
/root_dir/ ...
在 Database::Db 中,我有一个创建与 SQL SERVER 的连接的子例程。该子例程被导出并用于 Main.pm
示例:
数据库::数据库
my $config = {
db1 => {
host => 'dbi:Driver:server=ip01;database=db01',
user => 'user01',
pass => 'pass01'
},
db2 => {
host => 'dbi:Driver:server=ip02;database=db02',
user => 'user02',
pass => 'pass02'
},
db3 => {
host => 'dbi:Driver:server=ip03;database=db03',
user => 'user03',
pass => 'pass03'
}
};
sub connect_db {
use DBI;
my $self = shift;
return 0 unless $self;
my $dbh;
if (exists($config->{$self})) {
return $dbh = DBI->connect($config->{$self}->{host}, $config->{$self}->{user}, $config->{$self}->{pass}) || die( $DBI::errstr . "\n" ) ;
} else {
return "Connection not in config. \n" ;
}
return $dbh;
}
在 Main.pm 我这样连接:
my $dbh = connect_db('db1');
现在假设我需要在索引页面上连接到数据库,所以我将在 Main.pm 中有一个像这样的子例程索引:
sub index {
my $self = shift;
my $dbh = connect_db('db1');
...
$self->render();
}
现在我不希望每次用户访问索引页面时都建立新连接,我想检查连接是否处于活动状态,如果没有创建它。
我已经阅读了 ping 方法,但我不知道如何在这里实现它。
我还阅读了有关 DBIx 并尝试了以下实现:
sub connect_db {
use DBIx::Connector;
my $self = shift;
return 0 unless $self;
my $dbh;
if (exists($config->{$self})) {
my $conn = DBIx::Connector->new($config->{$self}->{host}, $config->{$self}->{user}, $config->{$self}->{pass}, {
RaiseError => 1,
AutoCommit => 1,
});
return $dbh = $conn->dbh; ;
} else {
return "Connection not in config. \n" ;
}
return $dbh;
}
这个实现能达到我想要的吗?当数据库连接处于活动状态以供使用且未重新创建时。如果是,像 Dbi 一样使用 DBIx 是否安全?我这里指的是:
my $dbh = $conn->dbh;
$dbh->do('INSERT INTO foo (name) VALUES (?)', undef, 'Fred' );
and not
$conn->run(fixup => sub {
$_->do('INSERT INTO foo (name) VALUES (?)', undef, 'Fred' );
});
谢谢
【问题讨论】:
标签: perl dbi mojolicious